百钱百鸡
1只公鸡值5文钱;1只母鸡值3文钱;3只小鸡值1文钱。请问用文钱买100只鸡,公鸡、母鸡和小鸡各有几只?
实际题目中会按照M文钱买N只鸡的形式
按公鸡母鸡小鸡的顺序分别输出结果,一组解答占一行,解答按照公鸡数目从大到小排序(其次母鸡,再次小鸡)
无解时请输出 no answer
如输入为:
100 100
则输出:
12 4 84
8 11 81
4 18 78
0 25 75
如输入为:
1 4
则输出为:
no answer
Hint
利用循环穷举所有可能
标答
1.#include<stdio.h> 2.int main() { 3. int a, b, c; 4. int money, number, flag; 5. scanf("%d %d", &money, &number); 6. flag = 0; 7. for (a = money/5; a >= 0; a--) 8. for (b = money/3; b >= 0; b--) 9. for (c = money; c >= 0; c--) { 10. if (a + b + c*3 == number && a*5 + b*3 + c == money) { 11. flag++; 12. printf("%d %d %d\n", a, b, c*3); 13. } 14. } 15. if ( flag == 0 ) 16. printf("no answer\n"); 17. return 0; 18.}
这题我也开始循环都是用for(a = 0; a < number; a++),导致超时了,所以需要优化,这题终端值都不是用0和number,
从money/5开始是因为输出要从大到小输出
这题相当于解方程组,xiao + gong + mu = number; xiao / 3+gong * 5 + mu * 3= money;
以后凡是涉及解方程组用for循环求解的,均要注意:临界值,至多2个循环即可,否则易超时(1秒等于千万级别运算次数)
还有一道换硬币的也是,我一开始用3个循环,超时超时超时,然后用了一个变量用另两个代替减少了一个for后就过了
我的
1 #include<stdio.h> 2 int main() { 3 int m, n, xiao, gong, mu, flag = 0; 4 scanf("%d %d", &m, &n); 5 for (gong = m/5; gong >=0; gong--) { 6 for (mu = m/3; mu >= 0; mu--) { 7 xiao = n - gong - mu;//用另外2个变量表示第三个变量,减少循环就过了 8 if (xiao % 3 == 0 && xiao / 3 + mu * 3 + gong * 5 == m && xiao >= 0) { 9 printf("%d %d %d\n", gong, mu, xiao);//xiao >= 0这个条件莫忘,一开始 10 flag = 1;、、忘了就没有过 11 } 12 } 13 } 14 if (flag == 0) 15 printf("no answer\n"); 16 return 0; 17 }