题目大意:给定k,要你输出满足1/k=1/x+1/y的所有情况。
思路:
根据 x>=y
-> 1/x>=1/y
-> 1/x+1/y>=1/y+1/y
-> 1/k>=2/y
-> y<=2k
确定了y的取值范围就可以枚举y了,从[k+1,2k],那么为什么是从k+1开始因为如果k=y显然只有x=0才成立,而分母不可能为0,k<y,则1/y>1/k显然不可能。所以只能取值[k+1,2k].
在确定了k,y后,因为知道了公式的两个变量就可以直接化简公式求出x,而不必要枚举x了。
1/k=1/x+1/y
-> 1/k-1/y=1/x
-> y-k/y*k=1/x
-> x=y * k/y-k
只有x为整数才满足等式,当x不为整数即分数,要倒过来才满足等式,这种情况全部舍弃。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
struct node{
int x,y;
};
node a[maxn];
int main(){
int k;
while(scanf("%d",&k)!=EOF){
memset(a,0,sizeof(a));
int cnt=0;
for(int y=k+1;y<=2*k;y++){
int x=(k*y)/(y-k);
if((k*y)%(y-k)==0){
a[cnt].x=x;a[cnt++]. y=y;
}
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
cout<<"1/"<<k<<" = "<<"1/"<<a[i].x<<" + "<<"1/"<<a[i].y<<endl;
}
}