描述
公元五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
现要求你打印出所有花一百元买一百只鸡的方式。
输入描述:
输入任何一个整数,即可运行程序。
输出描述:
输出有数行,每行三个整数,分别代表鸡翁,母鸡,鸡雏的数量
示例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不一定是个正确的数,会导致结果出错;
③当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;