UVA 10976 分数拆分

题目描述:https://vjudge.net/problem/UVA-10976

既然要求找出所有的x、y,枚举对象自然就是x、y了。可问题在于,枚举的范围如何?从1/12=1/156+1/13可以看出,x可以比y大很多。难道要无休止地枚举下去?当然不是。由于x≥y,有 ,因此 ,即y≤2k。这样,只需要在2k范围之内枚举y,然后根据y尝试计算出x即可。

在这需要用到一个判断float或者double型数字是否为整数的问题。
对于一个float或double数据类型,在有效数位以后的位数都是无效的值。
比如 float a=10.00000000000000001;
计算机就会将无效的位数截断,导致计算机读取的a就是10;
判断是否是整数,可以这样判断

float a;
#define bord 0.00001
if((a-(int)a<b) && (a-(int)a>-b))
{
//是整数
}
else
{
// 不是整数
}
#include<iostream>
using namespace std;
#define bord 0.00000001
#include<sstream>
int judge(double a)
{
    if(a-(int)a<bord&&a-(int)a>-bord)
    return 1;

    return 0;
}
        string s="";
int main()
{
    int k;
    while(scanf("%d",&k)!=EOF)
    {
        int count=0;

        string s1="";
        for(int y=1;y<=2*k;y++)
        {
            if(y==k)continue;
            double m=(double)k*y/((double)y-k);
            if(judge(m)&&m>=y)
            {
                int x=m;
                count++;
                ostringstream oss;
                oss<<"1/"<<(int)k<<" = 1/"<<(int)x<<" + 1/"<<(int)y<<"\n";
                s1+=oss.str();
            }
        }
        ostringstream oss;
        oss<<count<<endl;
        s+=oss.str()+s1;
    }   
        cout<<s;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值