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