C++:关于百钱问题的一些自我反省
百钱问题:将1元人民币兑换成1,2,5分的人民币,有多少种换法?
这仅仅只是一篇笔记嗷,记录了我自己的一些错误。
1.第一次代码
思路:穷举所有可能的组合,利用for循环嵌套实现。
#include<iostream>
using namespace std;
int main(){
int num = 0;//num表示有多少种换法
for (int i = 0; i < 100; i++)//i代表一分钱的个数
for (int j = 0; j < 50; j++)//j代表两分钱的个数
for(int k = 0;k < 20;k++)//k代表五分钱的个数
if(i+2*j+5*k == 100)
num++;
cout << "共计有" << num << "种换法" << endl;
return 0;
}
注意到这里使用了三重for循环,感觉有些麻烦,想了一下优化方法,于是有了一下代码。(此前还没编译运行,不知道有错误)
#include<iostream>
using namespace std;
int main(){
int num = 0;//num表示有多少种换法
for (int i = 0; i < 100; i++)//i代表一分钱的个数
for (int j = 0; j < 50; j++)//j代表两分钱的个数
if ((100 - i - (2 * j)) % 5 == 0 ) //利用取余为零且和为100的思路
num++;
cout << "共计有" << num << "种换法" << endl;
return 0;}
之后编译运行,发现结果不对。
初次检查发现,for循环语句里的条件语句有误,应该改为<=,但结果仍然不对。
2.第二次代码
for (int i = 0; i <= 100; i++)//i代表一分钱的个数
for (int j = 0; j <= 50; j++)//j代表两分钱的个数
运行结果仍是错误的。
细想了一下,发现if条件判断语句有误,因为会有(100 - i - 2 * j ) <0的情况。所以添加了一点代码。
3.第三次代码
#include<iostream>
using namespace std;
int main(){
int num = 0;//num表示有多少种换法
for (int i = 0; i <=100; i++)//i代表一分钱的个数
for (int j = 0; j <=50; j++)//j代表两分钱的个数
if ((100 - i - (2 * j)) % 5 == 0 && (100 - i - (2 * j)) >= 0) //利用取余为零且和为100的思路
num++;
cout << "共计有" << num << "种换法" << endl;
return 0;}
编译运行,答案正确,为541种。
然后,在写此片文章时,又有了一种优化思路:因为j是增量,所以当 (100 - i - (2 * j)) <= 0之后,(100 - i - (2 * j)) < 0成立,不必继续进行第二个for循环。因此,得出了现在的代码。
4.第四次代码
#include<iostream>
using namespace std;
int main(){
int num = 0;//num表示有多少种换法
for (int i = 0; i <=100; i++)//i代表一分钱的个数
for (int j = 0; j <=50 && (100 - i - (2 * j)) >= 0; j++)//j代表两分钱的个数
if ((100 - i - (2 * j)) % 5 == 0) //利用取余为零且和为100的思路
num++;
cout << "共计有" << num << "种换法" << endl;
return 0;}
5.运行结果
图中陈列了四次代码的运行结果
经过这样一道简单的题目,发现自己还是有很多不足之处,码路上还得多学习才是。
//文章仅供参考,第一次写博客,如有不足还请见谅,可以私信提供建议,谢谢