题目描述: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;
}