• UVA10976 Fractions Again?!


    即便是暴力枚举,也需要进行数学推导,尽可能减小枚举的范围。

    问题链接UVA10976 Fractions Again?!入门练习题,用C语言编写程序。

    题意简述:输入正整数k,求满足1/k=1/x+1/y并且x≥y的正整数对x和y。

    问题分析:先枚举y,因为x≥y,其范围小。其他要点如下:

    1.因为1/k=1/x+1/y且x>0,所以1/k>1/y,得y>k;

    2.x≥y,有1/x1/y,且1/k=1/x+1/y,所以1/k-1/y1/y,得y2k;

    3.这样只需要y在k+1到2k之间枚举试算即可;

    4.因为1/k=1/x+1/y,得x=ky/(y-k)。

    程序说明:枚举试算过程中,必须满足ky/(y-k)是整数,并且x≥y。由于还要统计满足条件的整数对有多少,并且还有先输出,所以使用了数组ansx[]和ansy[]。不使用数组的话,就需要算两遍,第1遍先统计数量,第2遍计算x和y。

    AC的C语言程序如下:

    /* UVA10976 Fractions Again?! */
    
    #include <stdio.h>
    
    #define MAXN 10000
    
    int main(void)
    {
        int k, x, y, end, sum, ansx[MAXN], ansy[MAXN];
    
        while(scanf("%d", &k) != EOF) {
            sum=0;
    
            end = 2 * k;
            for(y=k+1; y<=end; y++){
                if((y * k) % (y - k) == 0){
                    x = (y * k) / (y - k);
                    if(x >= y) {
                        ansx[sum] = x;
                        ansy[sum] = y;
                        sum++;
                    }
                }
            }
    
            printf("%d
    ",sum);
            for(x=0; x<sum; x++)
                printf("1/%d = 1/%d + 1/%d
    ",k, ansx[x], ansy[x]);
        }
    
        return 0;
    }


  • 相关阅读:
    四则运算WEB版
    最大子数组问题
    四则运算终极版
    软件工程个人作业02
    软件工程概论-构建之法阅读笔记01
    软件工程概论个人作业01
    软件工程概论作业-测试
    123
    【好文转载】凡人修真传-程序员的十个等级
    有趣的网站
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564361.html
Copyright © 2020-2023  润新知