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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章