Показать полную графическую версию : Почему моя программа выдает неверный результат?
Почему моя программа ввыдает неверный результат?
Почему? Надо было найти НОД(найбольший общий делитель)
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.
вот оптимальный более-менее алгоритм. если нужно объяснить как работает -- пиши.
Pavluha, Но при целочисельных типах, кажется, нельзя делить »
делить нельзя, зато можно получить целую часть от деления (div) или остаток (mod).
если вдруг нужно будет найти НОК (наименьшее общее кратное, воспользуйся формулой n1*n2=НОД(n1,n2)*НОК(n1,n2).)
Отличное решение! Главное рациональное... Завтра олимпиада, мне бы этой рациональности завтра
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.