Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2011, 11:56   #1
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию Длинное число

Нужно записать сумму цифр: 999 999 999 999 + 111 000 000 000

и тут возникли вопросы:
1 - как записать большое число? (int64 или как его там, не пойдёт, потому что число может быть и с 300 знаками)

Допустим, если их записывать через элементы массива, т.е. 1 число = 1 ячейка массива, то

2 - как сложить их, при этом учесть тот факт, что будут переводы (например, 9+1 = 10, в единицы 0, в десятки +1)

Последний раз редактировалось Fanyuus; 15.05.2011 в 11:58.
Fanyuus вне форума Ответить с цитированием
Старый 15.05.2011, 12:18   #2
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

http://www.delphisources.ru/pages/fa...g_numbers.html

такое подойдет?
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 15.05.2011, 13:00   #3
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Swarog
думаю пойдёт, теперь расшифруйте, что это? :D

я ещё не такой супер-пупер программист и поэтому, ничего не могу понять.


у меня есть вариант как сделать длинное число через массивы, но(!) как сделать так, чтобы ТП прочитал это число и только потом разложил его на массивы.

если первоначальное число использовать как строку, то как перевести из строки в число?
допустим - 123456789123 - это строка, а[1]=3 a[2]=2 a[3] = 1 a[4]=9.....

даже вот чтобы так сделать мне нужно от строки по 1 символу отсекать, переводить его в число и записывать в массив, отсекать с конца.

так вто - как это сделать?
*нужна программа, алгоритм
Fanyuus вне форума Ответить с цитированием
Старый 15.05.2011, 13:09   #4
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

в приведенной ссылке модуль создайте текстовый файл запихните туда текст из сслке и схраните под именем UMathServices.pas затем добавьте этот модуль в проект
project -> add to project

в фале в формой в секцию uses добаьте запись , UMathServices

теперь можно использовать, переводить ни чего не надо модуль вроде работает прям со строками

пример как сложить два числа:

Код:
s1 := '123456789009876543212345678';
s2 := '98765432345678909876543234567';
s1 := ulSum(s1,s2);
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 15.05.2011, 13:19   #5
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Цитата:
как перевести из строки в число?
atoi(); .......
Hemul вне форума Ответить с цитированием
Старый 15.05.2011, 13:21   #6
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

если не использовать отдельный модуль, то можете вполне сами написать - на деле все просто - заполняете массивы начиная от начала (то есть в обратном) порядке, затем просто циклом от начала проходитесь, складываете, и если число больше 10, то берете вычитаете из него 10, а к следующему элементу дополнительно добавляете единицу, не вижу ничего сложного)

так же и со строками - просто оперировать с кодами символа ord(a[i])-48 например)
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 15.05.2011, 13:27   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Swarog, +1

и вообще, поискать/почитать на тему "Длинная арифметика"

p.s. "как сложить их, при этом учесть тот факт, что будут переводы " - помните, как в начальной школе учили складывать числа в столбик? Вот по такому алгоритму и поступать. Записать оба числа так, чтобы их правые части (младшие разряды) совпали (ну или просто начинать от правых разрядов - два индекса) и складывать. Причём складывать каждый раз очередные разряды + перенос с прошлого разряда. Перенос с прошлого разряда перед циклом положить равным нулю.
Всё. Всё это пишется в коде чуть ли не быстрее, чем я тут словами размусоливаю..


Цитата:
если первоначальное число использовать как строку, то как перевести из строки в число?
допустим - 123456789123 - это строка, а[1]=3 a[2]=2 a[3] = 1 a[4]=9.....
Код:
const MaxSize = 300; {300 знаков}
type BigNum = array[1..MaxSize] of byte;
var
   MyNum : BigNum;
   i : integer;
   s : string;
begin
   WriteLn('Введите число (не более ',MaxSize,' знаков): ' );
   Readln(s);
   for i:=Length(s) to 1 do
    if s[i] in ['0'..'9'] then 
        MyNum[MaxSize - (Length(s)-i)] := ord(s[i])- ord('0')
    else begin
        WriteLn('Вы ввели не цифровой символ в разряде ',i);
        Halt; {стоп-машина!}    
    end;

всё.... число введено в MyNum ...

Последний раз редактировалось Serge_Bliznykov; 15.05.2011 в 13:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.05.2011, 19:12   #8
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Zer0 да не нужно меня учить как столбиком считать, знаю я, меня интересовало как это с массивами сделать, чуть позже (после моего сообщения) я уже поняла что прибавить к [i+1]+1, где сравнивалась сумма [i], это было всё понятно, волновала потом строка и перевод из неё в число.

Swarog,Hemul,Serge_Bliznykov - спасибо большое!)))

ладно, завтра всё проверю, и скажу чего и как
Fanyuus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинное деление в столбик Utkin Свободное общение 15 30.11.2010 10:22
Длинное тире ElenaA Общие вопросы Delphi 4 24.06.2010 09:10
Длинное целое The riddle Помощь студентам 5 13.06.2009 15:45
Длинное целое The riddle Помощь студентам 0 07.06.2009 11:06