描述

公元五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
现要求你打印出所有花一百元买一百只鸡的方式。

输入描述:

输入任何一个整数,即可运行程序。

输出描述:

 输出有数行,每行三个整数,分别代表鸡翁,母鸡,鸡雏的数量

示例1

输入:
1
复制
输出:
0 25 75
4 18 78
8 11 81
12 4 84
代码部分:
#include <stdio.h>
//以下是Senky的代码
void Buy() {
    int cock = 0; //cock公鸡最多20只
    int hen = 0; //hen母鸡最多33只
    int pullus = 0; //pullus雏鸡最多100只(百鸡)
    for (cock = 0; cock <= 20; cock++) {
        for (hen = 0; hen <= 33; hen++) {
            for (pullus = 0; pullus <= 100; pullus++) {
                if (0 == pullus % 3) {//雏鸡必须能被3整除否则不进入循环
                    if (100 != (cock + hen + pullus)) continue; //不是百鸡continue
                    if (100 == (cock * 5 + hen * 3 + pullus / 3)) {//是百钱则输出
                        printf("%d %d %d\n", cock, hen, pullus);
                    }
                }

            }
        }
    }
}
int main() {
    int n;
    scanf("%d", &n);
    if ((int)n == n) { //当n时整数
        Buy();//买鸡
    }
    return 0;//编辑于2022/10/08
}
代码优化:
#include <stdio.h>
//以下是Senky的代码
void Buy() {
    int cock = 0; //cock公鸡最多20只
    int hen = 0; //hen母鸡最多33只
    int pullus = 0; //pullus雏鸡最多100只(百鸡)
    for (cock = 0; cock <= 20; cock++) {
        //假设有了公鸡cock只,那么能买的母鸡就有了上限
        for (hen = 0; hen <= (100 - 5 * cock) / 3; hen++) {
            //假设有了公鸡cock只,母鸡hen只,那么凑够百钱要雏鸡pullus只
            pullus = 3 * (100 - 5 * cock - 3 * hen);
            if (100 == (cock + hen + pullus)) {//是百鸡
                printf("%d %d %d\n", cock, hen, pullus);
            }
        }
    }
}

int main() {
    int n;
    scanf("%d", &n);
    if ((int)n == n) { //当n时整数
        Buy();//买鸡
    }
    return 0;//编辑于2022/10/08
}
总结&优化:
①三层for循环变为了两层,代码时间复杂度提升一个数量级;
②代码不能这样写:
pullus = 100 - cock - hen;//是百鸡
            if (100 == (5*cock + 3*hen + pullus/3)) {//是百钱
                printf("%d %d %d\n", cock, hen, pullus);
            }
因为有取商运算,
pullus/3不一定是个正确的数,会导致结果出错;
③当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;