Delphi - Почему моя программа выдает неверный результат?

Ответить
Аватара пользователя
paul_8

Delphi - Почему моя программа выдает неверный результат?

Сообщение paul_8 »

Почему моя программа ввыдает неверный результат?



Почему? Надо было найти НОД(найбольший общий делитель)



Код:

Код: Выделить всё

var input,output:text; 
 n1,n2,d:real; 
begin 
assign(input,'input.txt'); reset(input); 
assign(output,'output.txt'); rewrite(output); 
readln(input,n1,n2); 
if n1>=n2 then d:=n1; 
if n2>=n1 then d:=n2; 
while ((n1/d)trunc(n1/d)) and ((n2/d)trunc(n2/d)) do 
d:=d-1; 
writeln(output,trunc(d)); 
close(input); 
close(output) 
end.
Аватара пользователя
Pavluha

Re: Delphi - Почему моя программа выдает неверный результат?

Сообщение Pavluha »

Код:

Код: Выделить всё

var input,output:text; 
n1,n2,d:real; 
begin 
 assign(input,'input.txt'); reset(input); 
 assign(output,'output.txt'); rewrite(output); 
 readln(input,n1,n2); 
 if n1>=n2 then d:=n1; 
 if n2>=n1 then d:=n2; 
 while ((n1/d)trunc(n1/d)) OR ((n2/d)trunc(n2/d)) do 
   d:=d-1; 
 writeln(output,trunc(d)); 
 close(input); 
 close(output) 
end.

И ещё: для переменных n1,n2 лучше поставить тип integer, longint или int64, так как НОД только для натуральных чисел.



Для больших чисел он работает очень медленно. счас напишу получше алгоритм.
Аватара пользователя
paul_8

Re: Delphi - Почему моя программа выдает неверный результат?

Сообщение paul_8 »

Pavluha, Но при целочисельных типах, кажется, нельзя делить
Аватара пользователя
Pavluha

Re: Delphi - Почему моя программа выдает неверный результат?

Сообщение Pavluha »

Код:

Код: Выделить всё

var n1,n2,r:longint;
function nod(a,b:longint):longint;
begin
 while (a0)and(b0) do
  if a>b then a:=a mod b else b:=b mod a;
 nod:=a+b;
end;
begin
 readln(n1,n2);
 r:=nod(n1,n2);
 writeln(r);
end.

вот оптимальный более-менее алгоритм. если нужно объяснить как работает -- пиши.




Цитата paul_8:



Pavluha, Но при целочисельных типах, кажется, нельзя делить
Delphi - Почему моя программа выдает неверный результат?




делить нельзя, зато можно получить целую часть от деления (div) или остаток (mod).



если вдруг нужно будет найти НОК (наименьшее общее кратное, воспользуйся формулой n1*n2=НОД(n1,n2)*НОК(n1,n2).)
Аватара пользователя
paul_8

Re: Delphi - Почему моя программа выдает неверный результат?

Сообщение paul_8 »

Отличное решение! Главное рациональное... Завтра олимпиада, мне бы этой рациональности завтра
Ответить

Вернуться в «Программирование и базы данных»