Войти

Показать полную графическую версию : Почему моя программа выдает неверный результат?


paul_8
29-01-2013, 20:05
Почему моя программа ввыдает неверный результат?

Почему? Надо было найти НОД(найбольший общий делитель)
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
29-01-2013, 20:13
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
29-01-2013, 20:22
Pavluha, Но при целочисельных типах, кажется, нельзя делить

Pavluha
29-01-2013, 20:22
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).)

paul_8
29-01-2013, 20:37
Отличное решение! Главное рациональное... Завтра олимпиада, мне бы этой рациональности завтра




© OSzone.net 2001-2012