题目链接:点击打开链接
公式挺好推的,注意一下枚举的范围即可
详见紫书183页
AC代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a[10005][5];
int main()
{
int k, ans, tem, i;
while(~scanf("%d",&k))
{
ans = 0;
memset(a, 0, sizeof(a));
for(i = k+1; i <= 2*k; ++i)
{
//cout << i << endl;
tem = k*i / (i-k);
if(tem * (i-k) == k*i)
{
//cout << tem << endl;
a[ans][0] = tem;
a[ans][1] = i;
ans++;
}
}
cout << ans << endl;
for(i = 0; i < ans; ++i)
printf("1/%d = 1/%d + 1/%d\n",k,a[i][0],a[i][1]);
}
return 0;
}
紫书上也说了,枚举的范围只需在2k范围内枚举y即可。但是开始我从1枚举到2k程序一直运行不出来,想了想原来是出现了负数和分母为0的情况。所以从k+1开始枚举才是正确的。