C语言:问题求解方法-穷举
来源:互联网 发布:js点击登录弹出登录框 编辑:程序博客网 时间:2024/05/19 00:48
任务代码:
问题1:
传统求解穷举方法(局限性:计算次数太多,程序运行耗时总共计算21*34*301次)
#include <stdio.h>int main(){ printf("解决问题:公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元买100只鸡能买公鸡,母鸡,小鸡多少?(提供所有方案)\n\n"); int cock,hen,chick; float price; for(cock=0;cock<=20;cock++)//公鸡最多能有20只 { for(hen=0;hen<=33;hen++)//母鸡最多有33只 { for(chick=0;chick<=100;chick++)//小鸡最多100只 { if(cock*5+hen*3+chick/3==100&&cock+hen+chick==100&&chick%3==0)//小鸡1/3元一只且要被3除尽,小鸡只能以3只3只的买,也就是说钱最小单位1元不可能有1/3元!!! { printf("公鸡:%d 母鸡:%d 小鸡:%d\n",cock,hen,chick);} } } } return 0;}问题改进:
#include <stdio.h>int main(){ printf("解决问题:公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元买100只鸡能买公鸡,母鸡,小鸡多少?(提供所有方案)\n\n"); int cock,hen,chick; float price; for(cock=0;cock<=20;cock++)//公鸡最多能有20只 { for(hen=0;hen<=33;hen++)//母鸡最多有33只 { chick=100-cock-hen;//简化小鸡的计算循环 if(cock*5+hen*3+chick/3==100 && chick%3==0)//小鸡1/3元一只且要被3除尽,小鸡只能以3只3只的买,也就是说钱最小单位1元不可能有1/3元!!! { printf("公鸡:%d 母鸡:%d 小鸡:%d\n",cock,hen,chick);} } } return 0;}
#include <stdio.h>int main(){ int a,b,c,d,e,f;//令1代表去,0代表不去 for(a=1;a>=0;a--) { for(b=1;b>=0;b--) { for(c=1;c>=0;c--) { for(d=1;d>=0;d--) { for(e=1;e>=0;e--) { for(f=1;f>=0;f--) { if(a+b>=1 && (a+d)!=2 && a+e+f==2 && (b+c==0||b+c==2) && c+d==1 && (d+e==0||d==1) ) { printf("a:%d\n",a); printf("b:%d\n",b); printf("c:%d\n",c); printf("d:%d\n",d); printf("e:%d\n",e); printf("f:%d\n",f); } } } } } } } return 0;}
实践问题:
问题1:
小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
提示:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
#include <stdio.h>int main(){int A,B,C;//代表三个学生int count=0 ;//代表第几种方案for(A=1;A<=5;A++)//将书籍从1-5标号{ for(B=1;B<=5;B++) { for(C=1;C<=5;C++) { if(A!=B&&B!=C&&C!=A)//判断三个人借的书是否不同,(a-b)*(b-c)*(c-a)!=0更好 { count++; printf("第%d种方案:",count); printf("A借%d号书, B借%d号书, C借%d号书. ",A,B,C); printf("\n"); } } }}return 0;}
问题2:
对于三位数字,若各位数字立方和等于该数,该数就是水仙花数。如153:153=1^3+5^3+3^3
#include <stdio.h>#include <math.h>int main(){ int iNumber,a,b,c;//a,b,c分别代表输入数字的个位,十位,百位 printf("三位数中的水性花数有:\n"); for(iNumber=100;iNumber<1000;iNumber++) { a=iNumber%10; //取出个位 b=(iNumber/10)%10; //取出十位 c=iNumber/100;//取出百位 if(pow(a,3)+pow(b,3)+pow(c,3)==iNumber) { printf("%d\n",iNumber); } } return 0;}
问题3:鸡兔共笼
鸡兔共有30只,脚共有90只,问鸡兔各有多少?
#include <stdio.h>#include <math.h>int main(){ int chick_number,bunny_number; for(chick_number=0;chick_number<=30;chick_number++) { for(bunny_number=0;bunny_number<=30;bunny_number++) { if(chick_number+bunny_number==30 && 2*chick_number+4*bunny_number==90) { printf("鸡有%d只,兔子有%d\n",chick_number,bunny_number); } } } return 0;}
问题4:
用一元人民币兑换成1分、2分和5分硬币,有多少种不同的兑换方法?请输出所有可能的方案。
提示:根据题意设i,j,k分别为兑换的1分、2分、5分硬币的枚数,则i,j,k的值应满足:i+j*2+k*5=100,根据取值范围构造循环解题即可。
#include <stdio.h>#include <math.h>int main(){int i,j,k,count=0;//i代表1分,j代表2分,k代表5分;for(i=0;i<=100;i++){ for(j=0;j<=50;j++) { for(k=0;k<=20;k++) { if(i+j*2+k*5==100) { ++count; printf("%d 个1,%d个2,%d个5\n",i,j,k); if(count%50==0) //每输出50个方案暂停一次 { printf("按任意键继续输出……\n"); getchar(); } } } }}return 0;}问题5:
张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是880,求以他们的年龄为前4项的等差数列的前20项。
#include <stdio.h>int main(){ int a,n,i,s; for(a=1; a<=4; a++) //这个只能通过不断试验枚举确定范围 for(n=1; n<=6; n++) if(n*4+a*6==26 && n*(n+a)*(n+a+a)*(n+a+a+a)==880) { printf("%d", n); //输出第1个 for(i=1; i<20; i++) { s=n+a*i; printf(", %d", s); //后面的19个都和前一个用逗号分隔输出 } printf("\n"); } return 0;}
执行情况:
知识总结:
心得体会:
阅读全文
0 0
- C语言:问题求解方法-穷举
- 第四周《C语言及程序设计》实践项目40 问题求解方法——穷举
- C语言:问题求解方法-迭代
- C语言 -- 数学问题求解
- C语言求解约瑟夫问题
- 一个C语言问题,求解
- C语言穷举法
- 第八周—C语言 穷举法(鸡兔共笼问题)
- 第八周—C语言 穷举法(换分币问题)
- 穷举求解鸡兔同笼问题
- 第四十课 问题求解方法——穷举 【项目1-9】
- C语言实现定积分求解方法
- C语言用递归方法求解阶乘
- C语言编程 N皇后问题求解
- 整数划分问题(C语言求解)
- 递归求解N皇后问题(c语言)
- 用C语言实现迷宫求解问题
- 迷宫问题的C语言求解
- 关于vs2005、vs2008和vs2010项目互转的总结
- 数据交互的加密算法
- 创建window service
- MongoDB 常用命令
- EXCEL 操作详解精品
- C语言:问题求解方法-穷举
- 备份和恢复MongoDB
- PHP魔术方法之构造方法__construct与析构方法__destruct
- 单点登录SSO的实现原理
- VIM命令
- Python读取XML
- c语言创建写入和读取TXT文件数据
- 松江1843路
- maven-in-five-minutes