| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1993 人关注过本帖
标题:转载乌鸦丘比特 的24点程序
取消只看楼主 加入收藏
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
结帖率:0
收藏
 问题点数:0 回复次数:2 
转载乌鸦丘比特 的24点程序

转载此帖的目的在于加强原创发表的技术性 提高大家参与的积极性 另外也可以使大家学习学习乌鸦丘比特这个程序的算法 大家共同进步么

如果谁要与他联系 crow2727@163.com 这个是他的email

[原创]较完善24点程序 24点的程序很多。除法一直是个头疼的问题。 我想出了一个半法用来解决除法: 定义work()函数————下面 算法:把每个整数看成分数,如4=4/1; work()是基于分数运算的函数,具体做法是分子分母分开运算; 如5/4+2/3=(5*3+2*4)/4*3 不做约分处理,假设结果为A/B则可用if(A==24*B)来判断; 可能情况除(a?b)?c?)d与(a?b)?(c?d)之外 还应该包含(a/(b?c))?d,(a-(b?c))?d;a/((b?c)?d);a/(b?(c?d)); 本代码可计算一些中间过程有分数出现的可能

代码如下:(很乱,没耐心不看没事的,知道算法就可以了 ) int work(int a,int b,int *c,int *d,int e) /*work ()为计算函数,a为第一个数的分子,*c为分子,b,*c同理*/ {int s; /* e为计算符号。1代表+,2代表-,3代表*,4代表*/ switch(e) /*work()返回计算结果分子,分母由指针*c返回*/ {case 1:s=(*d)*a+(*c)*b;*c=(*c)*(*d);break; case 2:s=(*d)*a-(*c)*b;*c=(*c)*(*d);break; case 3:s=a*b;*c=(*c)*(*d);break; case 4:s=a*(*d);*c=(*c)*b;break; } return s;} main() {int a[5],j,card[5],i1,i2,i3,i4,e[5],answer,count=0,aw1,aw2,n[5],yes=1,m=1,x; int *c;int *d;int *f;int *g; char get; while(yes) { a[1]=0; a[2]=0;a[3]=0;a[4]=0; printf("请输入数字:\n"); scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]); if(!(a[1]&&a[2]&&a[3]&&a[4])){printf("输入无效\n");continue;} for(i1=1;i1<=4;i1++) for(i2=1;i2<=4;i2++) {if(i1==i2)continue; for(i3=1;i3<=4;i3++) {if(i3==i2||i3==i1)continue; for(i4=1;i4<=4;i4++) {if(i4==i3||i4==i2||i4==i1)continue; /*洗牌,穷举所有顺序*/ card[1]=a[i1]; card[2]=a[i2]; card[3]=a[i3]; card[4]=a[i4]; for(e[1]=1;e[1]<=4;e[1]++) for(e[2]=1;e[2]<=4;e[2]++) { for(e[3]=1;e[3]<=4;e[3]++) /*穷举所有符号*/ {*c=1; *d=1; *f=1; *g=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算((a?b)?c)?d*/ answer=work(answer,card[3],c,d,e[2]); if(!(*c))m=0; answer=work(answer,card[4],c,d,e[3]);if(!(*c))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=3;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("((%d%c%d)%c%d)%c%d=24\n",card[1],n[1],card[2],n[2],card[3],n[3],card[4]);getch(); count++;} *c=1; m=1; aw1=work(card[1],card[2],c,d,e[1]); if(!(*c))m=0; /*计算(a?b)?(c?d)*/ aw2=work(card[3],card[4],f,g,e[2]); if(!(*f))m=0; answer=work(aw1,aw2,c,f,e[3]); if(!(*c))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=3;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("(%d%c%d)%c(%d%c%d)=24\n",card[1],n[1],card[2],n[3],card[3],n[2],card[4]);getch(); count++;}

} x=4;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算a/((b?c)?d)*/ answer=work(answer,card[3],c,d,e[2]); if(!(*c))m=0;*c=1; answer=work(card[4],answer,d,c,x);if(!(*d))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("%d/((%d%c%d)%c%d)=24\n",card[4],card[1],n[1],card[2],n[2],card[3]);getch(); count++;} m=1;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算a/(b?(c?d))*/ answer=work(card[3],answer,d,c,e[2]); if(!(*d))m=0; *c=1; answer=work(card[4],answer,c,d,x);if(!(*c))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("%d/(%d%c(%d%c%d))=24\n",card[4],card[3],n[2],card[1],n[1],card[2]);getch(); count++;

}m=1;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算(a-(b?c))?d*/ answer=work(card[3],answer,d,c,2);if(!(*d))m=0; *c=1; answer=work(answer,card[4],d,c,e[2]); if(!(*d))m=0;

if((answer==((*d)*24))&&m) {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }}printf("(%d-(%d%c%d))%c%d=24\n",card[3],card[1],n[1],card[2],n[2],card[4]);getch(); count++;} m=1;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; answer=work(card[3],answer,d,c,4);if(!(*d))m=0; *c=1; answer=work(answer,card[4],d,c,e[2]); if(!(*d))m=0;

if((answer==((*d)*24))&&m) /*计算(a/(b?c))?d*/ {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }}printf("(%d/(%d%c%d))%c%d=24\n",card[3],card[1],n[1],card[2],n[2],card[4]);getch(); count++;}

}

}}}if(!count)printf("对不起,无解\n");count=0;}}

[此贴子已经被作者于2004-07-20 12:13:23编辑过]

搜索更多相关主题的帖子: 丘比特 乌鸦 
2004-07-08 11:39
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
收藏
得分:0 

欢迎欢迎 等了你好久

刚刚执行了一下 出现两个错误和五个警告

错误 noname.c 2: 不可预料的文件结束在注解第 2 行在 work 函数中 错误 noname.c 146: 复合指令缺少 }在 work 函数中

不过算法还是值得研究的


qq:69558139
2004-07-19 18:57
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
收藏
得分:0 

恩 刚刚试过了 算法好厉害 真值得学习

乌鸦兄弟有什么原创的好程序 欢迎发表出来


qq:69558139
2004-07-20 12:14
快速回复:转载乌鸦丘比特 的24点程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020818 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved