题意:
给定正整数k(1<=k <= 10000),找出所有正整数 x>= y, 使得1/k = 1/x + 1/y
分析:
因为 x >= y
所以 1/x <= 1/y
因为 1/x + 1/y = 1/k
所以 1/k <= 2/y 即 y <= 2k 且 y >= k + 1
枚举y算出x即可
因为要避免浮点数运算, 所以可以通过1/k - 1/y = 1/x 推出 x = (k*y)/(k-y). 那么只要k*y可以整除(k-y), x就是整数, 在判断一下x是否大于0即可
#include <bits/stdc++.h> using namespace std; #define rep(i,a) for(int i = 0; i <= a; i++) const double eps = 1e-8; int n; int main() { #if LOCAL // freopen("1.txt","r",stdin); // freopen("2.txt","w",stdout); #endif // LOCAL int k; int X[10000], Y[10000]; while(scanf("%d", &k) != EOF){ int y = 1; int cnt = 0; int x; for(y = k + 1; y <= 2 * k ; y++){ if((k*y) % (y-k) == 0){ X[cnt] = (k*y )/ (y-k); Y[cnt] = y; cnt++; } } printf("%d ", cnt); for(int i = 0 ; i < cnt; i++){ printf("1/%d = 1/%d + 1/%d ", k ,X[i] ,Y[i]); } } }