早教吧 育儿知识 作业答案 考试题库 百科 知识分享

最接近的分数pascal最接近的分数TimeLimit:2000MSMemoryLimit:65536KTotalSubmit:4Accepted:2Description给出一个正小数,找出分子(非负)不超过M,分母不超过N(正数)的最简分数或整数,使其最接近给出的

题目详情
最接近的分数 pascal
最接近的分数
Time Limit:2000MS Memory Limit:65536K
Total Submit:4
Accepted:2
Description
给出一个正小数,找出分子(非负)不超过M,分母不超过N(正数)的最简分数或整数,使其最接近给出的小数。“最接近”是指在数轴上该分数距离给出的小数最近,如果这个分数不惟一,输出“TOO
MANY”。
Input
输入文件共有二行,第一行包含两个用空格隔开的正整数M和N(10),R的整数部分为一个阿拉伯数字,小数部分最多有十位。
Output
输出文件仅一行,若解唯一则输出“分子/分母”(整数K写成K/1),否则输出“TOO
MANY”。
Sample Input
360 120
3.1415926536
Sample Output
355/113
▼优质解答
答案和解析
var
   m,n:longint;
   r,x,y:double;
   a:array[1..2000] of double;
   mm,nn:array[1..2000] of integer;
   i,k,min:integer;

function gcd(a,b:integer):integer;
begin
  if b=0 then gcd:=a
    else gcd:=gcd(b,a mod b);
end ;

begin
     readln(m,n);
     readln(r);
     k:=1;
     y:=m/n-r;
     repeat
           mm[k]:=m;
           nn[k]:=n;
           x:=m/n-r;
           a[k]:=abs(x);
           inc(k);
           if x>0 then dec(m) else dec(n);
     until abs(x)>abs(y);
     min:=1;
     for i:=2 to k-1 do if a[min]>a[i] then min:=i;
     writeln;
     i:=gcd(mm[min],nn[min]);
     writeln(mm[min] div i:0,'/',nn[min] div i:0);
     readln;
end.