IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Длинная арифметика
сообщение
Сообщение #1


Гость






Не могли бы ли вы мне помочь (факю читал не то что нужно). Мне нужно : реализация длинной арифметики на массиве цифр этого числа, нужно превеод интеджера в длинную арифметику, остаток от деления и вывод этого числа.
например Inttolong(a:integer):integer;
modlong(num1,num2:long):long;
write(long);
Спасибо большое, если поможите.

P.S. Пишу не своего компьютера
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ну, раз то, что ты читал - не то, что нужно, то Google - твой помощник... Ищи...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






искал...
но не нашел, а реализовать не получается
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






помогите, в четверг сдавать sad.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Вот, пока не перешел на с++, пользовал такую свою заготовку для олимпиад.
На изящность, а тем более, на оптимальность код не претендует.

Тут есть 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. На алголисте есть, но на сях.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Спасибо smile.gif помогли
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






я понимаю, что выгляжу полным нубом, но подскажите как мне найти НОК (наименьшее общее кратное) двух длинных чисел.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Точно так же, как и для обычных (по той же формуле, только используя процедуры/функции для работы с длинными числами)...

Как для обычных чисел это делается, знаешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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

нет sad.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






а почему поиск на НОК не сработал?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 118
Пол: Женский

Репутация: -  0  +


Я зарегестрировалась (извините за флуд)
Надеюсь, что вы не среагруете на мой пол так же, как и на некоторх других форумах sad.gif


--------------------
Нам не дано предугадать как наше слово отзовется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 118
Пол: Женский

Репутация: -  0  +


Volvo...
А Вы не могли бы мне подсказать как находить НОК для обычных чисел?


--------------------
Нам не дано предугадать как наше слово отзовется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


НОК(a, b) = a*b/НОД(a, b)

НОД ищите алгоритмом эвклида
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 118
Пол: Женский

Репутация: -  0  +


извините, но я изучаю паскаль всего месяц и никак не могу понять как мне это сделать ( а завтра будет плохо если не принесу) вот то что дал Michael_Rybak мне подходит, я там все знаю, а вот в факю там много что непонятно sad.gif и реализовать нахождение НОКа не получается sad.gif
Помогите умоляю.


--------------------
Нам не дано предугадать как наше слово отзовется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 118
Пол: Женский

Репутация: -  0  +


:'( Неужели Volvo узнав что я девушка, передумал мне помочь :'( Почему люди на большинстве форумов отказываються помогать девушкам :'(


--------------------
Нам не дано предугадать как наше слово отзовется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






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 Не было этого никогда, чтоб я из-за пола человека отказывался ему помогать...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 118
Пол: Женский

Репутация: -  0  +


Спасибо, сейчас попробую
Просто когда я изучала HTML на одном форуме один парень объяснял, помогал мне, а потом я написала глагол в прошедшем времени(случайно так получилось что до этого были безродные ) он спросил: "Так ты девушка?" ну я скрывать и не собиралась , я ему честно ответила, а он меня тогда послал sad.gif


--------------------
Нам не дано предугадать как наше слово отзовется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 118
Пол: Женский

Репутация: -  0  +


сдала, но преподаватель сказал юниты - хорошо, но лучше все засунуть в один файл как это сделать вроде удталяю превую часть оне начинает ругаться


--------------------
Нам не дано предугадать как наше слово отзовется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Возьми модуль, удали в нем строки "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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 22.11.2017 0:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"