Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 16
1

Длинная Арифметика. Сложение

30.12.2015, 10:59. Просмотров 1358. Ответов 3
Метки нет (Все метки)

Считываем в строку a и b, 2 числа, соответственно. Нам нужно посчитать сумму этих двух чисел.
Диапазон
0 ≤ a, b ≤ 10^10000
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2015, 10:59
Ответы с готовыми решениями:

Длинная арифметика. Сложение
Задача такова: Два числа вводятся с клавиатуры, каждое в своей строке. Числа не превышают 1010000....

Сложение огромных чисел. Длинная арифметика
Здравствуйте!Подскажите,пожалуйста,каким образом в паскале складывать огромные числа,которые...

Длинная арифметика: как увеличить вместительность массива?
Важно! Я встретился с задачей, в которой происходит переход за диапазон переменной. Можете помочь?

Длинная арифметика - Показать прибыль или убытки за 1й и 2й месяц
Дано 2 числа по модулю не больших 10^30. Зарплата и деньги, которые нужно заплатить за кредит....

3
Модератор
62273 / 46550 / 32089
Регистрация: 18.05.2008
Сообщений: 112,531
30.12.2015, 11:09 2
Добавлено через 37 минут
Смотрите похожие темы внизу страницы, например эту
Длинная арифметика. Сложение
Если мало, в поиске по запросу Сложение длинных чисел.
0
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 16
30.12.2015, 11:44  [ТС] 3
Проблема в том, что тот код немного не работает. Слишком много времени уходит на один из тестов. Нужно как-нибудь, сделать только через string.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var
  c: char;
  a, b, o: array[1..10003] of byte;
  na, nb, i, l, x: longint;
 
begin
  repeat
    read(c);
    if c in ['0'..'9'] then
    begin
      inc(na); 
      a[na] := ord(c) - 48;
    end;
  until (c = #13) or (na = 10002);
  {-----------------------------------------------------------------------------------------}
  repeat
    read(c);
    if c in ['0'..'9'] then
    begin
      inc(nb);
      b[nb] := ord(c) - 48;
    end;
  until (c = #13) or (nb = 10002);
  if na > nb then l := na
  else l := nb;
  if (na > nb) then l := na else l := nb;
  {==========================================================================================}
  for i := 1 to na div 2 do
  begin
    x := a[i];
    a[i] := a[na - i + 1];
    a[na - i + 1] := x;
  end;
  for i := 1 to nb div 2 do
  begin
    x := b[i];
    b[i] := b[nb - i + 1];
    b[nb - i + 1] := x;
  end;
  {==========================================================================================}
  for i := 1 to l do
  begin
    o[i] := o[i] + a[i] + b[i];
    if (o[i] > 9) then begin o[i + 1] := trunc(o[i] / 10); o[i] := o[i] mod 10; end;
  end;
  if (o[l+1] > 0) then inc(l);
  for i := l downto 1 do write(o[i]); writeln;  
end.
0
8 / 3 / 4
Регистрация: 04.10.2015
Сообщений: 16
31.12.2015, 16:36 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Взято из книги "Песни о Паскале"
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{ Процедура распечатки сверхбольшого числа} 
procedure WriteBigNumber(var F: text; const aNum: TBigNumber); 
var i : integer; 
begin 
i:=CSize; 
while (i>0) and not (aNum[i] in ['1'..'9']) do Dec(i); 
if i=0 then Write(F, '0'); 
while i>0 do begin 
Write(F, aNum[i]); 
Dec(i); 
end; 
Writeln(F); Writeln(F); 
end; 
{ Процедура сложения сверхбольших чисел в столбик. 
Результат помещается в первое число, что равносильно оператору сложения
aNum1 := aNum1 + aNum2 } 
procedure AddNumbers(var aNum1, aNum2 : TBigNumber); 
var  i,j : integer; 
n1, n2 : integer;  { слагаемые цифры} 
sum, ovr : integer;  { сумма и перенос}  
begin 
ovr:=0; { в начале переполнение= 0 } 
{ цикл по всем цифрам, кроме последней} 
for i:=1 to CSize-1do begin 
j:=i;  { j используется после завершения цикла} 
{ Если в текущей позиции пробел, то считаем его нулем, 
а иначе символ цифры преобразуем в цифру 0..9 } 
if aNum1[i]=' ' 
then n1:=0 
else n1:=Ord(aNum1[i])-Ord('0'); { n1 = 0..9 } 
if aNum2[i]=' ' 
then n2:=0 
else n2:=Ord(aNum2[i])-Ord('0'); { n2 = 0..9 } 
sum:= (n1+n2+ovr) mod 10; { сумма sum = 0..9 } 
ovr:= (n1+n2+ovr) div 10; { перенос ovr = 0 или 1 } 
{ Преобразуем цифру в символ цифры} 
aNum1[i]:= Char(sum + Ord('0')); 
end; 
{ Если было переполнение, то за последней цифрой помещаем единицу} 
if ovr<>0 then aNum1[j+1]:='1'; 
end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2015, 16:36

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

Длинная арифметика, перевод чисел другие системы счисления
Добрый вечер программисты ,у меня есть один ,наверно сложный, вопрос, проблема вот в чем когда я...

Длинная арифметика. Сложение. Вводятся два числа длиной 0<n<255 . Найти сумму этих чисел
Программа работает, но выходит ошибка, если размеры строк различаются, как ее исправить, помогите,...

Длинная арифметика
Вычислить точное значение суммы 1^2 + 2^2 +3^2 +...+ n^2 (n&gt;1999). Задачу необходимо выполнить...

Длинная арифметика
Пожалуйста помогите! Нужно найти n!!,(произведение всей четных чисел от 2 до n,если n четно и всех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.