It is easy to see that for every fraction in the form 1 k (k > 0), we can always find two positive integers x and y, x ≥ y, such that:
1/ k = 1 /x + 1/ y
Now our question is: can you write a program that counts how many such pairs of x and y there are for any given k?
Input
Input contains no more than 100 lines, each giving a value of k (0 < k ≤ 10000).
Output
For each k, output the number of corresponding (x, y) pairs, followed by a sorted list of the values of x and y, as shown in the sample output. Sample Input 2 12 Sample Output 2 1/2 = 1/6 + 1/3 1/2 = 1/4 + 1/4 8 1/12 = 1/156 + 1/13 1/12 = 1/84 + 1/14 1/12 = 1/60 + 1/15 1/12 = 1/48 + 1/16 1/12 = 1/36 + 1/18 1/12 = 1/30 + 1/20 1/12 = 1/28 + 1/21 1/12 = 1/24 + 1/24
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main(){ int k,x,y,o,p,s; while(cin>>k&&k){ int a[10086],b[10086]; o=p=s=0; for(y=k+1;y<=2*k;y++){ if((k*y)%(y-k)==0){ a[o++]=k*y/(y-k); b[p++]=y; s++; } } cout<<s<<endl; for(int i=0;i<o;i++){ printf("1/%d = 1/%d + 1/%d\n",k,a[i],b[i]); } } return 0; }
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main(){ int k; while(cin>>k&&k){ int y,i=0,a[10000][2]; for(y=k+1;y<=2*k;y++){ if(k*y%(y-k)==0){ a[i][0]=k*y/(y-k); a[i][1]=y; i++; } } cout<<i<<endl; for(int j=0;j<i;j++){ cout<<"1/"<<k<<" = 1/"<<a[j][0]<<" + 1/"<<a[j][1]<<endl; } } return 0; }
【分析】
题目共有三个未知数:X、Y、K。K是已知,如果知道X、Y中的一个,则可以求出另一个。又因为X>=Y,所有1/X<=1/Y,加上1/K=1/X+1/Y,X用Y代替后可得Y<=2*K,由此得到Y的范围,又Y是大的那个数,所以Y至少也要比K大才可以,X用公式求出即可。