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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2013, 21:58   #1
makaroshka_1
Новичок
Джуниор
 
Регистрация: 23.12.2013
Сообщений: 1
По умолчанию Длинные числа.

Задание:
1. Выберите для представления длинных чисел подходящий тип (массив или строку). Помните, каждая из указанных структур имеют преимущества и недостатки, которые будут влиять на реализацию алгоритмов обработки целых чисел в дальнейшем.
2. Объявите псевдоним TLong для представления типа целых чисел с числом разрядов не менее 255. В комментарии укажите, в каком порядке будут располагаться разряды длинного числа в вашем типе (в младших элементах - младшие разряды, или в младших элементах - старшие разряды).
3. Опишите процедуру инициализации переменной типа TLong: процедура должна иметь два параметра, один из которых - переменная для инициализации TLong, второй - строковое значение, которое содержит "естественную" запись длинного числа в виде последовательности цифр. Помните, что при использовании массива, следует обнулять его элементы, соответсвующие старшим разрядам длинного числа.
4. Опишите процедуру, которая выводит заданное длинное число на экран в "естественном" порядке.
5. Опишите процедуру, которая осуществляет вычитание двух длинных чисел (всегда - из большего меньшее). Подсказка: можно попробовать (не обязательно) использовать рекурсию - поразрядное вычитание повторяющаяся регулярная операция. Не забудьте возможность заема из старших разрядов.
6. Напишите программу, которая находит целую часть и остаток от деления одного длинного числа на другое. Исходные числа хранятся в текстовом файле.
Мое решение:
Код:
type TLong=array[1..255] of integer;{массив из цифр числа справа-налево  }
var s,s1,s2,ss1,ss2:string;
  m,m1,m2,mt:TLong;
i,j,n1,n2,a1,k1,a2,k2,kol:integer;
b:boolean;
f:text;
function perev(s:string):string;{переворачиваем строку чтобы проще было }
var s1:string;
i,j:integer;
begin
s1:=s;
j:=0;
for i:=length(s) downto 1 do
   begin
    j:=j+1;
     s1[j]:=s[i];
   end;
 perev:=s1;
end;
procedure minus(m1,m2:TLong;n1:integer;var m:TLong);{вычитание как в столбик}
var i,j:integer;
bb:boolean;
begin
for i:=1 to n1 do{идем по массиву}
begin
if m2[i]<=m1[i] then m[i]:=m1[i]-m2[i] else{если вычитаемая меньше -вычитаем}
 begin 
 bb:=false;
 for j:=i+1 to n1 do if m1[j]<>0 then bb:=true;{проверяем что есть еще цифры}
 if bb then begin m1[i+1]:=m1[i+1]-1;m[i]:=10+m1[i]-m2[i];end{берем десяток и вычитаем}
 else b:=true;{конец вычитания}
end;  
end;
end;
procedure vyvod(a:tlong;n:integer);
var i:integer;
begin
 for i:=n downto 1 do write(a[i]);
 writeln;
end;
begin
assign(f,'3.txt');
reset(f);
readln(f,s1);{считали из файла}
readln(f,s2);
 
close(f);
ss1:=perev(s1);{перевернули строки}
ss2:=perev(s2);
n1:=length(ss1);{вычислили размер}
n2:=length(ss2);
for i:=1 to n1 do{заполнили доп. массивы 0}
    begin
     m1[i]:=0;
     m2[i]:=0;
     m[i]:=0;
     mt[i]:=0;
    end;
    for i:=1 to n1 do{заполнили массивы числами}
begin
   val(ss1[i],a1,k1);
   m1[i]:=a1;
 end;
for i:=1 to n2 do
begin
   val(ss2[i],a2,k2);
   m2[i]:=a2;
 end;
 write(' 1 chislo = ');
 vyvod(m1,n1);
 write(' 2 chislo = ');
  vyvod(m2,n2);
 b:=false;
 kol:=0;
 repeat{деление - т е повторение вычитания}
     minus(m1,m2,n1,m);{вычли}
    for i:=1 to n1 do mt[i]:=m1[i];{сохранили в доп массив остаток}
    for i:=1 to n1 do m1[i]:=m[i];{переписили остато в исходный}
     for i:=1 to n1 do m[i]:=0;{обнулили дополнительный}
    kol:=kol+1;{кол-во вычитаний}
until b;
writeln('chelaya chast =',kol-1);
 write('ostatok = '); 
 for i:=1 to n1 do if mt[i]=0 then j:=i;{нашли последний 0}
 if j>1 then begin j:=j-1;
vyvod(mt,j);
 end else writeln('= 0');
readln;
end.
Ошибки:
Отсутствуют подпрограммы: инициализации, сравнения длинных чисел, необходимые для ясной реализации алгоритма деления.
При выполнении деления счетчик тоже должен быть длинным числом.
Процедура вычитания должна иметь не более трех параметров: уменьшаемое, вычитаемое и результат. Не следует использовать внутри нее глобальные переменные.
makaroshka_1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинные числа alizon09 Фриланс 1 09.02.2013 12:45
Вычесления НОД (длинные числа) n3250sasha C++ Builder 0 21.12.2011 16:39
на Си++ описать длинные беззнаковые целые числа Alisa91 Помощь студентам 0 05.12.2011 19:54
Деление длинных чисел на длинные числа Dr. Feelgood Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.06.2010 12:05
длинные числа molodzo Общие вопросы C/C++ 4 21.02.2008 12:46