qq_52057606 2022-08-14 16:03 采纳率: 100%
浏览 83
已结题

c++ de最接近的分数

最接近的分数
总时间限制: 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;
}
  • 写回答

2条回答

  • 智者知已应修善业 2022-08-15 09:39
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月24日
  • 已采纳回答 8月16日
  • 创建了问题 8月14日

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿