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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 09:59   #1
Snake95_95
Новичок
Джуниор
 
Регистрация: 16.12.2013
Сообщений: 4
По умолчанию Сложение длинных чисел

1. Выберите для представления длинных чисел подходящий тип (массив или строку). Помните, каждая из указанных структурн имеют преимущества и недостатки, которые будут влиять на реализацию алгоритмов обработки целых чисел в дальнейшем.
2. Объявите псевдоним TLong для представления типа целых чисел с числом разрядов не менее 255. В комментарии укажите, в каком порядке будут располагаться разряды длинного числа в вашем типе (в младших элементах - младшие разряды, или в младших элементах - старшие разряды).
3. Опишите процедуру инициализации переменной типа TLong: процедура должна иметь два параметра, один из которых - переменная для инициализации TLong, второй - строковое значение, которое содержит "естественную" запись длинного числа в виде последовательности цифр. Помните, что при использовании массива, следует обнулять его элементы, соответсвующие старшим разрядам длинного числа.
4. Опишите процедуру, которая осуществляет сложение двух длинных чисел. Подсказка: можно попробовать (не обязательно) использовать рекурсию - поразрядное сложение повторяющаяся регулярная операция. Не забудьте перенос в следующий разряд.
5. Опишите процедуру, которая выводит заданное длинное число на экран в "естественном" порядке.
6. Напишите программу, которая складывает длинные числа, хранящиеся в текстовом файле (количество чисел в файле неизвестно, но не менее одного).Вот числа которые находятся в файле middle.txt через ентер
Цитата:
928375892375972345729579824358
345872346782368462
873587136762347876826357678265
9837687874672
.ответ при сложении: Результат сложения чисел в файле middle.txt
1801963029138666104740407745757. проблема в том программа выдает ошибку пишет, что индекс находится вне границ массива. и указывает на эту строчку: for i:=1 to u do s1[i]:=Chr(ch1[u-i+1]+48); Моежете помочь, как сделать что программа работала. Вот она сама.
Код:
var s1,s2:string;
ch1,ch2:array[1..255] of integer;
fileIN: text;
p,i,u:integer;
begin
Assign(fileIN,'C:\Users\hp-pc\Documents\Война и мир\middle.txt');
Reset(fileIn);
readln(fileIN,s1);
while not eof(fileIN) do begin
readln(fileIN,s2);
p:=0;
for i:=1 to length(s1) do ch1[length(s1)-i+1]:=Ord(s1[i])-48;
for i:=1 to length(s2) do ch2[length(s2)-i+1]:=Ord(s2[i])-48;
if length(s1)>length(s2) then u:=length(s1)
else u:=length(s2);
for i:=1 to u do
begin
p:=p+ch1[i]+ch2[i];
ch1[i]:=p mod 10;
p:= p div 10;
end;
if p>0 then begin
inc(u);
ch1[u]:=p;
end;
for i:=1 to u do s1[i]:=Chr(ch1[u-i+1]+48);
end;
for i:=u downto 1 do write(ch1[i]);
close(fileIN);
end.

Последний раз редактировалось Stilet; 16.12.2013 в 10:45.
Snake95_95 вне форума Ответить с цитированием
Старый 16.12.2013, 10:39   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Компилятор fpc. Ошибок компиляции нет.
Содержимое текстового файла
Цитата:
11111111111111111111111111111111111 111111
222222222222222222222222222
333333333333333333333333333
Результат
Изображения
Тип файла: jpg Безымянный.jpg (41.1 Кб, 128 просмотров)
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 16.12.2013, 10:54   #3
Snake95_95
Новичок
Джуниор
 
Регистрация: 16.12.2013
Сообщений: 4
По умолчанию

Ну так программа правильный результат не выводит. Она не работает. А прпвильный результкт при сложении вот:Результат сложения чисел в файле middle.txt
1801963029138666104740407745757
Ошибка где то аёв программе, и я найти не могу. Чтоб выдавал правильный результат.

Последний раз редактировалось Snake95_95; 16.12.2013 в 10:57.
Snake95_95 вне форума Ответить с цитированием
Старый 16.12.2013, 11:58   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от Snake95_95 Посмотреть сообщение
Ну так программа правильный результат не выводит. Она не работает. А прпвильный результкт при сложении вот:Результат сложения чисел в файле middle.txt
1801963029138666104740407745757
Ошибка где то аёв программе, и я найти не могу. Чтоб выдавал правильный результат.
Код:
for i:=1 to u do s1[i]:=Chr(ch1[u-i+1]+48);
end;
Вот здесь вы теряете последний символ в строке.
Сделайте так
Код:
 if p>0 then
        begin
          inc(u);
          ch1[u]:=p;
          SetLength(s1,u);
        end;
Код:
uses crt;

var
  s1,s2:string;
  ch1,ch2:array[1..255] of integer;
  fileIN: text;
  p,i,u:integer;
begin
  clrscr;
  Assign(fileIN,'middle.txt');
  Reset(fileIn);
  readln(fileIN,s1);
  while not eof(fileIN) do
    begin
      for i:=1 to 255 do
        begin
          ch1[i]:=0; // обнуление массивов
          ch2[i]:=0;
        end;
      readln(fileIN,s2);
      p:=0;
      for i:=1 to length(s1) do
        ch1[length(s1)-i+1]:=Ord(s1[i])-48;
      for i:=1 to length(s2) do
        ch2[length(s2)-i+1]:=Ord(s2[i])-48;
      if length(s1)>length(s2) then
        u:=length(s1)
      else
        u:=length(s2);
      for i:=1 to u do
        begin
          p:=p+ch1[i]+ch2[i];
          ch1[i]:=p mod 10;
          p:= p div 10;
        end;
      if p>0 then
        begin
          inc(u);
          ch1[u]:=p;
          SetLength(s1,u);
        end;
      for i:=1 to u do
        s1[i]:=Chr(ch1[u-i+1]+48);
    for i:=u downto 1 do
      write(ch1[i]);
    writeln;
    end;
  close(fileIN);
  writeln(s1);
end.
//1801963029138666104740407745757

Последний раз редактировалось ZX Spectrum-128; 16.12.2013 в 12:19.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 16.12.2013, 12:15   #5
Snake95_95
Новичок
Джуниор
 
Регистрация: 16.12.2013
Сообщений: 4
По умолчанию

А программа работает? Просто сейчас не начем проверить. Компа нет под рукой.
Snake95_95 вне форума Ответить с цитированием
Старый 16.12.2013, 12:22   #6
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Да, работает.
Изображения
Тип файла: jpg Безымянный.jpg (25.9 Кб, 125 просмотров)
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 16.12.2013, 19:15   #7
Snake95_95
Новичок
Джуниор
 
Регистрация: 16.12.2013
Сообщений: 4
По умолчанию

Спасибо. Программа работает, но выдает неверный результат. Мне нужно чтоб получился ответ:18019630291386661047404077457 57
Snake95_95 вне форума Ответить с цитированием
Старый 16.12.2013, 19:40   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Судя по всему, у Вас "кривой" файл middle.txt

Ну, в таком случае попробуйте код (я дополнил буквально пару строк в коде ZX Spectrum-128)

Код:
var
  s1,s2:string;
  ch1,ch2:array[1..255] of integer;
  fileIN: text;
  p,i,u:integer;
begin
  Assign(fileIN,'middle.txt');
  Reset(fileIn);
  readln(fileIN,s1);
  s1 := trim(s1);
  while not eof(fileIN) do
    begin
      for i:=1 to 255 do
        begin
          ch1[i]:=0; {// обнуление массивов}
          ch2[i]:=0;
        end;
      readln(fileIN,s2);
      s2 := trim(s2);
      p:=0;
      for i:=1 to length(s1) do
        ch1[length(s1)-i+1]:=Ord(s1[i])-48;
      for i:=1 to length(s2) do
        ch2[length(s2)-i+1]:=Ord(s2[i])-48;
      if length(s1)>length(s2) then
        u:=length(s1)
      else
        u:=length(s2);
      for i:=1 to u do
        begin
          p:=p+ch1[i]+ch2[i];
          ch1[i]:=p mod 10;
          p:= p div 10;
        end;
      if p>0 then
        begin
          inc(u);
          ch1[u]:=p;
          SetLength(s1,u);
        end;
      for i:=1 to u do
        s1[i]:=Chr(ch1[u-i+1]+48);
    for i:=u downto 1 do
      write(ch1[i]);
    writeln;
    end;
  close(fileIN);
  writeln(s1);
  Readln
end.

на всякий случай прилагаю свой middle.txt
Вложения
Тип файла: rar middle_txt.rar (153 байт, 7 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.12.2013, 19:41   #9
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Ну, а какой результат она выводит? Не такой разве?
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 16.12.2013, 19:44   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ZX Spectrum-128 Посмотреть сообщение
Ну, а какой результат она выводит? Не такой разве?
коллега, попробуйте свою программу на выложенном мной выше файле middle.txt...
я думаю, что у него в файле куча лишних пробелов, они всё портят
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Tasm]Сложение/Умножение длинных чисел falcon92 Помощь студентам 0 17.11.2010 15:34
Сложение длинных чисел C++ LaDark Общие вопросы C/C++ 0 15.11.2010 18:56
Ввод длинных чисел yukl Помощь студентам 1 18.05.2010 16:15
Сложение длинных чисел одного знака при помощи двунаправленных связанных списков Povar Паскаль, Turbo Pascal, PascalABC.NET 0 11.12.2008 14:35
Умножение длинных чисел SeRhy Помощь студентам 1 28.11.2008 20:04