算24程序

int DEBUG,sum[45],a,b,c,d;
void make24(int a,int b,int c,int d);
main(int argc,char *argv[])
{
DEBUG=1;
if(argc<5)
{
printf("Error:use as\nm1.exe 2 3 4 5");
exit(0);
}
a=atoi(argv[1]);
b=atoi(argv[2]);
c=atoi(argv[3]);
d=atoi(argv[4]);
;
make24(a,b,c,d);
make24(a,b,d,c);
make24(a,c,b,d);
make24(a,c,d,b);
make24(a,d,b,c);
make24(a,d,c,b);
;
make24(b,c,d,a);
make24(b,c,a,d);
make24(b,d,c,a);
make24(b,d,a,c);
make24(b,a,c,d);
make24(b,a,d,c);
;
make24(c,b,a,d);
make24(c,b,d,a);
make24(c,d,b,a);
make24(c,d,a,b);
make24(c,a,d,b);
make24(c,a,b,d);
;
make24(d,c,a,b);
make24(d,c,b,a);
make24(d,b,c,a);
make24(d,b,a,c);
make24(d,a,c,b);
make24(d,a,b,c);
;
}
void make24(int a,int b,int c,int d)
{
if(DEBUG)if(!sum[1]&&a+b+c+d==24){sum[1]++;printf("\n%d+%d+%d+%d=24",a,b,c,d);}
if(DEBUG)if(!sum[2]&&a+b+c-d==24){sum[2]++;printf("\n%d+%d+%d-%d=24",a,b,c,d);}
/*          */
if(DEBUG)if(!sum[3]&&a*b+c+d==24){sum[3]++;printf("\n%d*%d+%d+%d=24",a,b,c,d);}
if(DEBUG)if(!sum[4]&&a*b+c-d==24){sum[4]++;printf("\n%d*%d+%d-%d=24",a,b,c,d);}
if(DEBUG)if(!sum[5]&&a*b-c-d==24){sum[5]++;printf("\n%d*%d-%d-%d=24",a,b,c,d);}
if(DEBUG)if(!sum[6]&&a%b==0&&a/b+c+d==24){sum[6]++;printf("\n%d/%d+%d+%d=24",a,b,c,d);}
;
if(DEBUG)if(!sum[7]&&(a+b)*c+d==24){sum[7]++;printf("\n(%d+%d)*%d+%d=24",a,b,c,d);}
if(DEBUG)if(!sum[8]&&(a+b)*c-d==24){sum[8]++;printf("\n(%d+%d)*%d-%d=24",a,b,c,d);}
if(DEBUG)if(!sum[9]&&(a-b)*c+d==24){sum[9]++;printf("\n(%d-%d)*%d+%d=24",a,b,c,d);}
if(DEBUG)if(!sum[10]&&(a-b)*c-d==24){sum[10]++;printf("\n(%d-%d)*%d-%d=24",a,b,c,d);}
if(DEBUG)if(!sum[11]&&(a+b)%c==0&&(a+b)/c+d==24){sum[11]++;printf("\n(%d+%d)/%d+%d=24",a,b,c,d);}
;
if(DEBUG)if(!sum[12]&&(a+b+c)*d==24){sum[12]++;printf("\n(%d+%d+%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[13]&&(a+b-c)*d==24){sum[13]++;printf("\n(%d+%d-%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[14]&&(a-b-c)*d==24){sum[14]++;printf("\n(%d-%d-%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[15]&&(a+b+c)%d==0&&(a+b+c)/d==24){sum[15]++;printf("\n(%d+%d+%d)/%d=24",a,b,c,d);}
;
if(DEBUG)if(!sum[16]&&(a+b)*(c+d)==24){sum[16]++;printf("\n(%d+%d)*(%d+%d)=24",a,b,c,d);}
if(DEBUG)if(!sum[17]&&(a+b)*(c-d)==24){sum[17]++;printf("\n(%d+%d)*(%d-%d)=24",a,b,c,d);}
if(DEBUG)if(!sum[18]&&(a-b)*(c-d)==24){sum[18]++;printf("\n(%d-%d)*(%d-%d)=24",a,b,c,d);}
/*          */
if(DEBUG)if(!sum[19]&&a*b*c+d==24){sum[19]++;printf("\n%d*%d*%d+%d=24",a,b,c,d);}
if(DEBUG)if(!sum[20]&&a*b*c-d==24){sum[20]++;printf("\n%d*%d*%d-%d=24",a,b,c,d);}
if(DEBUG)if(!sum[21]&&a*b%c==0&&a*b/c+d==24){sum[21]++;printf("\n%d*%d/%d+%d=24",a,b,c,d);}
if(DEBUG)if(!sum[22]&&a*b%c==0&&a*b/c-d==24){sum[22]++;printf("\n%d*%d/%d-%d=24",a,b,c,d);}
;
if(DEBUG)if(!sum[23]&&a*b+c*d==24){sum[23]++;printf("\n%d*%d+%d*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[24]&&a*b-c*d==24){sum[24]++;printf("\n%d*%d-%d*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[25]&&c%d==0&&a*b+c/d==24){sum[25]++;printf("\n%d*%d+%d/%d=24",a,b,c,d);}
if(DEBUG)if(!sum[26]&&c%d==0&&a*b-c/d==24){sum[26]++;printf("\n%d*%d-%d/%d=24",a,b,c,d);}
;
if(DEBUG)if(!sum[27]&&(a+b)*c*d==24){sum[27]++;printf("\n(%d+%d)*%d*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[28]&&(a+b)*c%d==0&&(a+b)*c/d==24){sum[28]++;printf("\n(%d+%d)*%d/%d=24",a,b,c,d);}
if(DEBUG)if(!sum[29]&&(a-b)*c*d==24){sum[29]++;printf("\n(%d-%d)*%d*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[30]&&(a-b)*c%d==0&&(a-b)*c/d==24){sum[30]++;printf("\n(%d-%d)*%d/%d=24",a,b,c,d);}
if(DEBUG)if(!sum[31]&&a*b%(c+d)==0&&a*b/(c+d)==24){sum[31]++;printf("\n%d*%d/(%d+%d)=24",a,b,c,d);}
if(DEBUG)if(!sum[32]&&c-d!=0&&a*b%(c-d)==0&&a*b/(c-d)==24){sum[32]++;printf("\n%d*%d/(%d-%d)=24",a,b,c,d);}
;
if(DEBUG)if(!sum[33]&&b*d-c!=0&&a*d/(b*d-c)==24){sum[33]++;printf("\n%d/(%d-%d/%d)=24",a,b,c,d);}
if(DEBUG)if(!sum[34]&&b-c*d!=0&&a*c/(b-c*d)==24){sum[34]++;printf("\n%d/(%d/%d-%d)=24",a,b,c,d);}
if(DEBUG)if(!sum[35]&&(a+b*c)%d==0&&(a+b*c)/d==24){sum[35]++;printf("\n(%d+%d*%d)/%d=24",a,b,c,d);}
if(DEBUG)if(!sum[36]&&(a*b-c)%d==0&&(a*b-c)/d==24){sum[36]++;printf("\n(%d*%d-%d)/%d=24",a,b,c,d);}
if(DEBUG)if(!sum[37]&&b*d%c==0&&a*d+b*d/c==24){sum[37]++;printf("\n(%d+%d/%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[38]&&(a+b*c)*d==24){sum[38]++;printf("\n(%d+%d*%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[39]&&(a-b*c)*d==24){sum[39]++;printf("\n(%d-%d*%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[40]&&b*d%c==0&&a*d-b*d/c==24){sum[40]++;printf("\n(%d-%d/%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[41]&&(a*b-c)*d==24){sum[41]++;printf("\n(%d*%d-%d)*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[42]&&a*d%b==0&&a*d/b-c*d==24){sum[42]++;printf("\n(%d/%d-%d)*%d=24",a,b,c,d);}
/*          */
if(DEBUG)if(!sum[43]&&a*b*c*d==24){sum[43]++;printf("\n%d*%d*%d*%d=24",a,b,c,d);}
if(DEBUG)if(!sum[44]&&a*b*c%d==0&&a*b*c/d==24){sum[44]++;printf("\n%d*%d*%d/%d=24",a,b,c,d);}
if(DEBUG)if(!sum[45]&&a*b%(c*d)==0&&a*b/c/d==24){sum[45]++;printf("\n%d*%d/%d/%d=24",a,b,c,d);}
}

/*  2+(4+5+4+3)+(4+4+6+10)+3=2+16+24+3=45
如果设计一个算24的程序呢,呵呵,有好多方法,最通常的想法是,做一个表达式运算器,然后穷举各种

;/
a+b+c+d
a+b+c-d
;
a*b+c+d
a*b+c-d
a*b-c-d
a/b+c+d
;
(a+b)*c+d
(a+b)*c-d
(a-b)*c+d
(a-b)*c-d
(a+b)/c+d
;
(a+b+c)*d
(a+b-c)*d
(a-b-c)*d
(a+b+c)/d
;
(a+b)*(c+d)
(a+b)*(c-d)
(a-b)*(c-d)
;
a*b*c+d
a*b*c-d
a*b/c+d
a*b/c-d
;
a*b+c*d
a*b-c*d
a*b+c/d
a*b-c/d
;
(a+b)*c*d
(a+b)*c/d
(a-b)*c*d
(a-b)*c/d
a*b/(c+d)
a*b/(c-d)
;
a/(b-c/d)
a/(b/c-d)
(a+b*c)/d
(a*b-c)/d
(a+b/c)*d
(a+b*c)*d
(a-b*c)*d
(a-b/c)*d
(a*b-c)*d
(a/b-c)*d
;//
a*b*c*d
a*b*c/d
a*b/c/d
;/
*/
 
回复人: njhhack(剑影) (2001-10-28 14:18:21)  得0分
嘿嘿这次全部能处理代码也简单多了包你看得懂  
回复人: njhhack(剑影) (2001-10-28 15:13:28)  得0分
唉,本人的联系地址有所改变,这样有不懂的可以来找我
oicq:10772919
e-mail:njhhack@21cn.com
主页:hotsky.363.net
------------------------------------
其实算24也没什么困难的,我的思路是这样:
分两步走:1.找出所有可能的算24的表达式组合,并把不可能算出24的表达式剔除掉,
比如我们找到一个表达式a-b-c-d,但显然这个表达式是算不出24的,所以我们就不
要它了,经过选择,我们得到了下面这45个表达式:

a+b+c+d
a+b+c-d
;
a*b+c+d
a*b+c-d
a*b-c-d
a/b+c+d
;
(a+b)*c+d
(a+b)*c-d
(a-b)*c+d
(a-b)*c-d
(a+b)/c+d
;
(a+b+c)*d
(a+b-c)*d
(a-b-c)*d
(a+b+c)/d
;
(a+b)*(c+d)
(a+b)*(c-d)
(a-b)*(c-d)
;
a*b*c+d
a*b*c-d
a*b/c+d
a*b/c-d
;
a*b+c*d
a*b-c*d
a*b+c/d
a*b-c/d
;
(a+b)*c*d
(a+b)*c/d
(a-b)*c*d
(a-b)*c/d
a*b/(c+d)
a*b/(c-d)
;
a/(b-c/d)
a/(b/c-d)
(a+b*c)/d
(a*b-c)/d
(a+b/c)*d
(a+b*c)*d
(a-b*c)*d
(a-b/c)*d
(a*b-c)*d
(a/b-c)*d
;
a*b*c*d
a*b*c/d
a*b/c/d

然后我们进入第2步,对a,b,c,d这4个数字进行全排列,一共有24种排列方法,然后用这24种排列
方法对45个表达式都运算一次,这样就不会漏掉任何一种可能,但这理有一个问题,就是可能会出
现大量重复,比如2*3*4*1和3*2*4*1和4*3*2*1他们其实是同一种方法,是重复的,不过要去掉这
种重复是困难的,为此本人提出一个简化方法,就是每种表达式只取一种结果,这样就可以极大的
简化编程,同时又去掉了重复,虽然这样会漏掉一些同一个表达式有两种算法的情况,但至少达到
这样的效果,就是可以找出所以可以的表达式算法,也就是说只要这个表达式能算出24,我就一定
能把他找出来,这样就不会漏掉任何一个可能的表达式,我的程序用sum[]数组实现这种选择优化
方法是给每个表达式设定一个sum[x]变量,每算到一种可能的结果,就把sum[x]的值加1,我们只
输出当sum[x]是0的结果
在运算时还有一个问题要注意,在遇到除法时要注意分母不能等于0,还有就是除法的整除性
比如a*b/(c-d)要注意c-d=0的情况,还有比如4/3不能整除的情况,这可以用4%3的方法来求余,
从而达到判断是否整除的目的,
呵呵,我想我的这个算法虽不是最优的,但也是很不错的一种穷举算法,若有兄弟比我想的更好,不
要忘了和多说一下,我要好好学学哟:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值