народ! help! )))) как перевести дробь из десятичной в правильную и чтоб была несократимой (чтобы числитель и знаменатель были простыми натуральными числами)
Altair
13.07.2005 6:49
я не старался.... и время 3.49 .... я еще не спал
const eps=0.000001; var r:real; z,d,ch,m:integer; dt:real; i,nod:integer;
function max(a,b:integer):integer; begin if a > b then max := a else max := b; end; begin readln( r ); z := trunc( r ); dt := r-z; m := 1; while abs(dt-trunc(dt)) > eps do begin dt := dt * 10; m := m * 10; end; d := trunc( dt ); ch := m*z+d; {ñîêðàùàåì} for i := 1 to max(ch,m) do if (ch mod i=0) and (m mod i=0) then nod:=i; ch:=ch div nod; m:=m div nod; writeln(ch,'/',m); end.
VAR p,q,qmax:integer; d, r, min: real; BEGIN write('r, qmax='); readln(r, qmax); { r - не целое число, qmax - кол-во итераций (циклов) } p:=0; q:=1; min:=r; REPEAT IF p / q < r THEN inc(p) ELSE inc(q); d:=abs(r-p/q); IF d < min THEN BEGIN min:=d; writeln(p:7,'/',q) END UNTIL (q >= qmax) OR (d = 0); readln; END.
А вообще: чтобы дробь была несократимой .нужно поделить числитель и знаменатель на НОД (GCD):
{ Евклид (Euclidus) } function GCD (A: integer; B: integer): integer; begin while (a <> 0) and (b <> 0) do if a >= b then a := a mod b else b := b mod a; GCD := a + b; { один - ноль } end;
Катюха
13.07.2005 18:40
спасибки всем откликнувшимся))))))
Добавлено: народ, ещё один глупый вопрос: как сохранить результаты решения в файл?))))
Romtek
13.07.2005 18:49
writeln (F, 'Результат: ', result);
Банально, да?
klem4
13.07.2005 21:45
Я думаю, если вознимкют подобные вопросы, то одной строчкой не обойтись :D , Катюха, посмотри вот это : FAQ Файлы ну или вот тебе пример записи :
uses crt; var x:integer; f:Text; // или например file of integer;