欢迎来到天天文库
浏览记录
ID:44416096
大小:1.93 MB
页数:50页
时间:2019-10-21
《C++经典问题算法分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、—、百钱买百鸡问题(枚举算法)★算法分析:1、对百钱买百鸡问题的所有结果进行逐一统计验证(枚举验证b2、公鸡最多只能买20只,母鸡最多只能买33只,小鸡最多只能买300只。3、用for循环进行逐一验证★源代码:4、对小鸡的费用应用x/3代替x*(1/3),因为1/3在整型变量下的值为0o5、需保证小鸡的数量是3的倍数,即x%3==0oBialgorithml.cpp工口凶"百钱买白躅问题(迭代算迭分析)_"公鸡每只5元,母鸡每只3元,小鸡三只4元#includeusingnamespacestd;intmain()in
2、tFor(g=O;g<=20;g++)for(m=0;m<=33;m++),,«n«;for(x=O;x<=300;x++)iF((5*g+3*n+x/3==100)&&(g+n+x==100)&&(x%3==0)){cout«,1公鸡cout«"母鸡cout«,i小鸡cout<3、公鸡:0母鸡:25公鸡:4母鸡:18丿公鸡:8母鸡:11彳性鸡:12母鸡:4/DPressanykeytocontinue、鸡!75、鸡:78、鸡:81、鸡:84图1-2二、填写运算符问题(枚举算法)★算法分析:仁5个数字需要填入4、4个运算符。2、每两个数字之间有4种运算符可以选择。3、当运算符中填入除号时,右边的被除数不能为0.4、乘除的优先级大于加减的优先级。5、可以用循环的方法逐一填入各种运算符。★源代码:a(gonthm2.cppttincludeusingnamespacestd;intnain()intj,i[5]9num[6],sign,result;intcount=0;Floatleft,right;charoper[5]-5、cin6、>>nun[j];cout<<,epleaseinputtheresult;cin>>result;For(i[1]=1;i[1]<=4;i[1]**)7、8、(num[2]f-0))For(i[2]=1;i[2]<=4;i[2]**)iF((i[2]<4)9、10、(nun[3]?=0))For(i[3]=1;i[3]<=4;i[3]++)if((i[3]<4)11、12、(num[4]?=0))For(i[4]=1;i[4]<=U;i[4]**)II(nun[5]f=0))left=0;right=nun[1];sign=1;For(j=1;j<=4;13、j++)switch(oper[i[j]])case*♦*:left-left*sign*right;sign=1;right=nun[j*1];break;case"-":leFt=left*sign*right;sign=-1;riaht-numri*11:if(leFt*sign*right—result)iF(count==0)cout<<,,noan14、swer?,B;return0;图2-1三、汉诺塔问题(递归算法)★算法分析:仁汉诺塔问题可以运用递归算法解决。2、递归是函数本身调用直接或者间接调用自己的方法。3、在汉诺塔问题中需要的步骤数是2An-1o4、汉诺塔问题步骤解析:(1)把1座上()个盘子借助3座移动到2座。(2)把1座上的第n个盘子移动到3座。(3)把2座上的()个盘子借助1座移动到3座。(4)我们假设用h(n,a,b,c)表示把1座n个盘子借助2座移动到3座。由此可得岀结论:(1)上是h(n,1,3,2),(2)上是(,2,1,3)★源代码:S3-1★执行结果:"F:15、t机实战基地DebugaIgorithm3.exe'BSB汉诺塔问题pleaseinputnumber:3thesteptonoving3diskes1—>31—>23>21--->32>12>3k—>3请按任意键继续・・・图3-2★形象示例:图3-3★故事缘由:据说古代有一个梵塔,塔内有3个座A、B、CoA座上有64个圆盘,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移动到C座,但每次只能移动一个圆盘,并在移动过程中始终保持大盘在下,小盘在上。在移动过程中只能利用B座。现在需要写出移动的步骤。这就是汉诺塔问题。16、盘移当时这个和尚觉得很难,于是他想,要是有一个人能把前面的63个动到B座,自己再把最后一个圆盘移动到C座,那就简单了。所以他找了另一个和尚来做这件事。但是另一个和尚也觉得很难,于是又找来了第三
3、公鸡:0母鸡:25公鸡:4母鸡:18丿公鸡:8母鸡:11彳性鸡:12母鸡:4/DPressanykeytocontinue、鸡!75、鸡:78、鸡:81、鸡:84图1-2二、填写运算符问题(枚举算法)★算法分析:仁5个数字需要填入
4、4个运算符。2、每两个数字之间有4种运算符可以选择。3、当运算符中填入除号时,右边的被除数不能为0.4、乘除的优先级大于加减的优先级。5、可以用循环的方法逐一填入各种运算符。★源代码:a(gonthm2.cppttincludeusingnamespacestd;intnain()intj,i[5]9num[6],sign,result;intcount=0;Floatleft,right;charoper[5]-5、cin6、>>nun[j];cout<<,epleaseinputtheresult;cin>>result;For(i[1]=1;i[1]<=4;i[1]**)7、8、(num[2]f-0))For(i[2]=1;i[2]<=4;i[2]**)iF((i[2]<4)9、10、(nun[3]?=0))For(i[3]=1;i[3]<=4;i[3]++)if((i[3]<4)11、12、(num[4]?=0))For(i[4]=1;i[4]<=U;i[4]**)II(nun[5]f=0))left=0;right=nun[1];sign=1;For(j=1;j<=4;13、j++)switch(oper[i[j]])case*♦*:left-left*sign*right;sign=1;right=nun[j*1];break;case"-":leFt=left*sign*right;sign=-1;riaht-numri*11:if(leFt*sign*right—result)iF(count==0)cout<<,,noan14、swer?,B;return0;图2-1三、汉诺塔问题(递归算法)★算法分析:仁汉诺塔问题可以运用递归算法解决。2、递归是函数本身调用直接或者间接调用自己的方法。3、在汉诺塔问题中需要的步骤数是2An-1o4、汉诺塔问题步骤解析:(1)把1座上()个盘子借助3座移动到2座。(2)把1座上的第n个盘子移动到3座。(3)把2座上的()个盘子借助1座移动到3座。(4)我们假设用h(n,a,b,c)表示把1座n个盘子借助2座移动到3座。由此可得岀结论:(1)上是h(n,1,3,2),(2)上是(,2,1,3)★源代码:S3-1★执行结果:"F:15、t机实战基地DebugaIgorithm3.exe'BSB汉诺塔问题pleaseinputnumber:3thesteptonoving3diskes1—>31—>23>21--->32>12>3k—>3请按任意键继续・・・图3-2★形象示例:图3-3★故事缘由:据说古代有一个梵塔,塔内有3个座A、B、CoA座上有64个圆盘,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移动到C座,但每次只能移动一个圆盘,并在移动过程中始终保持大盘在下,小盘在上。在移动过程中只能利用B座。现在需要写出移动的步骤。这就是汉诺塔问题。16、盘移当时这个和尚觉得很难,于是他想,要是有一个人能把前面的63个动到B座,自己再把最后一个圆盘移动到C座,那就简单了。所以他找了另一个和尚来做这件事。但是另一个和尚也觉得很难,于是又找来了第三
5、cin
6、>>nun[j];cout<<,epleaseinputtheresult;cin>>result;For(i[1]=1;i[1]<=4;i[1]**)
7、
8、(num[2]f-0))For(i[2]=1;i[2]<=4;i[2]**)iF((i[2]<4)
9、
10、(nun[3]?=0))For(i[3]=1;i[3]<=4;i[3]++)if((i[3]<4)
11、
12、(num[4]?=0))For(i[4]=1;i[4]<=U;i[4]**)II(nun[5]f=0))left=0;right=nun[1];sign=1;For(j=1;j<=4;
13、j++)switch(oper[i[j]])case*♦*:left-left*sign*right;sign=1;right=nun[j*1];break;case"-":leFt=left*sign*right;sign=-1;riaht-numri*11:if(leFt*sign*right—result)iF(count==0)cout<<,,noan
14、swer?,B;return0;图2-1三、汉诺塔问题(递归算法)★算法分析:仁汉诺塔问题可以运用递归算法解决。2、递归是函数本身调用直接或者间接调用自己的方法。3、在汉诺塔问题中需要的步骤数是2An-1o4、汉诺塔问题步骤解析:(1)把1座上()个盘子借助3座移动到2座。(2)把1座上的第n个盘子移动到3座。(3)把2座上的()个盘子借助1座移动到3座。(4)我们假设用h(n,a,b,c)表示把1座n个盘子借助2座移动到3座。由此可得岀结论:(1)上是h(n,1,3,2),(2)上是(,2,1,3)★源代码:S3-1★执行结果:"F:
15、t机实战基地DebugaIgorithm3.exe'BSB汉诺塔问题pleaseinputnumber:3thesteptonoving3diskes1—>31—>23>21--->32>12>3k—>3请按任意键继续・・・图3-2★形象示例:图3-3★故事缘由:据说古代有一个梵塔,塔内有3个座A、B、CoA座上有64个圆盘,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移动到C座,但每次只能移动一个圆盘,并在移动过程中始终保持大盘在下,小盘在上。在移动过程中只能利用B座。现在需要写出移动的步骤。这就是汉诺塔问题。
16、盘移当时这个和尚觉得很难,于是他想,要是有一个人能把前面的63个动到B座,自己再把最后一个圆盘移动到C座,那就简单了。所以他找了另一个和尚来做这件事。但是另一个和尚也觉得很难,于是又找来了第三
此文档下载收益归作者所有