最接近的分数
总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
给出一个正小数,找出分子不超过 M,分母不超过 N 的最简分数或整数,使其最接近给出的小数。“最接近”是指在该分数的值与给出的小数之间的差值最小,如果这个分数不惟一,输出”TOO MANY“。
输入
输入为两行,第一行包含以空格分隔的正整数 M 和 N(1≤M,N≤1000),表示要求的分数其分子不超过 M,分母不超过 N;第二行为小数 R(R>0),R 的整数部分为一个阿拉伯数字,小数部分最多有十位。
输出
输出仅一行,若解惟一输出“分子/分母”(若为整数 K,写成 K/1),否则输出“TOO MANY”。
样例输入
【样例 1】
360 120
3.1415926536
【样例 2】
7 9
0.5634920635
样例输出
【样例 1】
355/113
【样例 2】
TOO MANY
我感觉我没有地方错呀,但为什么我只有六十分呢?
我的代码
#include<cstdio>
using namespace std;
int main()
{
double xs,cha=10.0,f;
int m,zi,mu,n,ans=-1,js;
scanf("%d%d",&n,&m);
scanf("%lf",&xs);
for(int i=1;i<=m;i++)
{
js=xs*i;
if (js>n) break;
f=(double)js/(double)i;
if (i==1)
{
ans=1;
cha=xs-f;
zi=js;
mu=i;
}
else if (zi*i!=mu*js)
{
if(xs-f==cha)ans++;
if(xs-f<cha)
{
ans=1;
cha=xs-f;
zi=js;
mu=i;
}
}
js++;
if (zi*i!=mu*js&&js<=n)
{
f=(double)js/(double)i;
if (f-xs==cha) ans++;
if (f-xs<cha)
{
ans=1;
cha=f-xs;
zi=js;
mu=i;
}
}
}
if (ans>1) printf("TOO MANY");
else printf("%d/%d",zi,mu);
return 0;
}