Помощь - Поиск - Пользователи - Календарь
Полная версия: Длинная арифметика
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Reflex
Не могли бы ли вы мне помочь (факю читал не то что нужно). Мне нужно : реализация длинной арифметики на массиве цифр этого числа, нужно превеод интеджера в длинную арифметику, остаток от деления и вывод этого числа.
например Inttolong(a:integer):integer;
modlong(num1,num2:long):long;
write(long);
Спасибо большое, если поможите.

P.S. Пишу не своего компьютера
volvo
Ну, раз то, что ты читал - не то, что нужно, то Google - твой помощник... Ищи...
Гость
искал...
но не нашел, а реализовать не получается
Гость
помогите, в четверг сдавать sad.gif
Michael_Rybak
Вот, пока не перешел на с++, пользовал такую свою заготовку для олимпиад.
На изящность, а тем более, на оптимальность код не претендует.

Тут есть InToTNum, +, -, *, /, PrintLong

Остаток от деления вырази как a-(a div b)*b

Код (Показать/Скрыть)


Пример использования:

Program Long;
Uses LongMath;
Var A,B,C :TNum;
Begin
InputLong(A);
InputLong(B);
Dvd(A,B,C);
Writeln('A:',Len(A));
Writeln('B:',Len(B));
PrintLong( C );
Readln;
End.


P.S. На алголисте есть, но на сях.
Гость
Спасибо smile.gif помогли
Гость
я понимаю, что выгляжу полным нубом, но подскажите как мне найти НОК (наименьшее общее кратное) двух длинных чисел.
volvo
Точно так же, как и для обычных (по той же формуле, только используя процедуры/функции для работы с длинными числами)...

Как для обычных чисел это делается, знаешь?
Гость
Цитата
Как для обычных чисел это делается, знаешь?

нет sad.gif
Гость
а почему поиск на НОК не сработал?
Reflex
Я зарегестрировалась (извините за флуд)
Надеюсь, что вы не среагруете на мой пол так же, как и на некоторх других форумах sad.gif
Reflex
Volvo...
А Вы не могли бы мне подсказать как находить НОК для обычных чисел?
Michael_Rybak
НОК(a, b) = a*b/НОД(a, b)

НОД ищите алгоритмом эвклида
Reflex
извините, но я изучаю паскаль всего месяц и никак не могу понять как мне это сделать ( а завтра будет плохо если не принесу) вот то что дал Michael_Rybak мне подходит, я там все знаю, а вот в факю там много что непонятно sad.gif и реализовать нахождение НОКа не получается sad.gif
Помогите умоляю.
Reflex
:'( Неужели Volvo узнав что я девушка, передумал мне помочь :'( Почему люди на большинстве форумов отказываються помогать девушкам :'(
volvo
Reflex, я еще не успел просто smile.gif

Смотри... Вот так вычисляется НОК (по-английски LCM: Least Common Multiplier) для обычных чисел типа Integer (для проверки - запусти эту программу и посмотри, что она выдает):

{ GCD - это Greatest Common Divider = НОД }
function GCD (A: integer; B: integer): integer;
begin
while (a <> 0) and (b <> 0) do
if a >= b then
a := a mod b
else
b := b mod a;
GCD := a + b;
end;

function LCM (A: integer; B: integer): integer;
begin
LCM := a * b div GCD (a, b)
end;

begin
A := 12;
B := 23;
R := LCM(A, B);
writeln('НОК = ', R);
end.


Совершенно аналогично вычислим его для длинных чисел, заменив все операции на процедуры:

uses longmath;

procedure GCD (A: TNum; B: TNum; var res: TNum);
var
Zero, DRes, MRes, T: TNum;
begin
InToTNum(0, Zero);
while (Cmp(a, Zero) = '>') and (Cmp(b, Zero) = '>') do
if Cmp(a, b) in ['>', '='] then begin

Dvd(a, b, DRes);
Mul(DRes, b, MRes);
Sub(A, MRes, T);
A := T;

end
else begin

Dvd(b, a, DRes);
Mul(DRes, a, MRes);
Sub(b, MRes, T);
B := T;

end;

Add(a, b, res);
end;

function LCM (A: TNum; B: TNum; var res: TNum);
var T, MRes: TNum;
begin
Mul(a, b, MRes);
GCD(a, b, T);
Dvd(MRes, T, res);
end;

var
A, B, R: TNum;
begin
InputLong(A); { для проверки введи 12}
InputLong(B); { здесь - для проверки - 23 }
LCM(A, B, R);
Write('NOD = ');
PrintLong( r ); { ... и сравни результат... }
end.


Цитата
Неужели Volvo узнав что я девушка, передумал мне помочь
С чего ты взяла? blink.gif Не было этого никогда, чтоб я из-за пола человека отказывался ему помогать...
Reflex
Спасибо, сейчас попробую
Просто когда я изучала HTML на одном форуме один парень объяснял, помогал мне, а потом я написала глагол в прошедшем времени(случайно так получилось что до этого были безродные ) он спросил: "Так ты девушка?" ну я скрывать и не собиралась , я ему честно ответила, а он меня тогда послал sad.gif
Reflex
сдала, но преподаватель сказал юниты - хорошо, но лучше все засунуть в один файл как это сделать вроде удталяю превую часть оне начинает ругаться
Michael_Rybak
Возьми модуль, удали в нем строки "Unit LongMath;", "Interface" и "Implementation", а после каждого объявления процедуры/функции, находившегося *до* слова Implementation, допиши после точки с запятой: "forward;". Например:

Procedure Add(A,B:TNum;Var C:TNum); {Сложение} forward;
Procedure Sub(A,B:TNum;Var C:TNum); forward;
...


Это называется "предварительное объявление", т.е. ты говоришь компилятору, что такая функция с такими параметрами есть, а как она работает - будет сказано ниже. Таким приемом можно реализовать, например, вложенную рекурсию - когда А вызывает В, а В вызывает А.

А код программы вставь непосредственно перед "end.":

...
Procedure Dvd;
...
begin
...
End;
{здесь вставь объявление своих переменных}
Begin
For iii:=0 To 100 Do Begin
mt[iii]:=iii Mod 10;
dt[iii]:=iii Div 10;
End;
{здесь вставь свой код}
End.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.