电脑怎么用c语言写丘比特,转载乌鸦丘比特 的24点程序

转载乌鸦丘比特 的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编辑过]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值