Почему моя программа выдает неверный результат?
Почему моя программа ввыдает неверный результат?
Почему? Надо было найти НОД(найбольший общий делитель)
Код:
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.
|
Код:
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, так как НОД только для натуральных чисел.
Для больших чисел он работает очень медленно. счас напишу получше алгоритм.
|
Pavluha, Но при целочисельных типах, кажется, нельзя делить
|
Код:
var n1,n2,r:longint;
function nod(a,b:longint):longint;
begin
while (a<>0)and(b<>0) 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, Но при целочисельных типах, кажется, нельзя делить »
|
делить нельзя, зато можно получить целую часть от деления ( div) или остаток ( mod).
если вдруг нужно будет найти НОК (наименьшее общее кратное, воспользуйся формулой n1*n2=НОД(n1,n2)*НОК(n1,n2).)
|
Отличное решение! Главное рациональное... Завтра олимпиада, мне бы этой рациональности завтра
|
Время: 11:06.
© OSzone.net 2001-