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.运行结果

图中陈列了四次代码的运行结果

经过这样一道简单的题目,发现自己还是有很多不足之处,码路上还得多学习才是。

//文章仅供参考,第一次写博客,如有不足还请见谅,可以私信提供建议,谢谢

posted @ 2021-11-01 14:16  团火  阅读(280)  评论(0编辑  收藏  举报