UVa - 10976 - Fractions Again?!

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;
}
View Code
#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;
}
View Code

【分析】

    题目共有三个未知数: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用公式求出即可。

posted @ 2018-03-30 20:42  子诚-  阅读(143)  评论(0编辑  收藏  举报