Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Почему моя программа выдает неверный результат? (http://forum.oszone.net/showthread.php?t=252663)

paul_8 29-01-2013 20:05 2077988

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

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

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 2077991

Код:

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 2077999

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

Pavluha 29-01-2013 20:22 2078000

Код:

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).)

paul_8 29-01-2013 20:37 2078020

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


Время: 11:06.

Время: 11:06.
© OSzone.net 2001-