| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3305 人关注过本帖
标题:关于计算24点输出式子重复的问题
只看楼主 加入收藏
魔城侠客
Rank: 1
等 级:新手上路
帖 子:200
专家分:0
注 册:2006-4-4
结帖率:50%
收藏
 问题点数:0 回复次数:33 
关于计算24点输出式子重复的问题

刚搜索下论坛贴子,发现24点输出式子重复的问题好像也不能得到解决,小弟我再来问下如何解决
比如4*7-6+2与4*7+2-6这两个式子重复,,,以下为个人程序


#include<stdio.h>
#define N 4
#define true 1
#define false 0
int molecule[N],denominator[N],r;
int G_C_D(int a,int b) //求两数的最大公约数
{
int temp;
if(a<b) {temp=a;a=b;b=temp;}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
//以下计算分数参与,计算采用通分和约分
void calculate(int *q,int *s,int *p) //计算式子
{
int gys,gbs,yue,i;
for(i=0;i<=2;i++)
{
gys=G_C_D(*(q+1),denominator[*p]); //最大公约数
gbs=*(q+1)*denominator[*p]/gys; //最小公倍数
if(*(s+i)==0) //0代表+
{
*q=gbs/(*(q+1))*(*q)+gbs/denominator[*(p+i+1)]*molecule[*(p+i+1)];
*(q+1)=gbs;
}
else if(*(s+i)==1) //1代表-
{
*q=gbs/(*(q+1))*(*q)-gbs/denominator[*(p+i+1)]*molecule[*(p+i+1)];
*(q+1)=gbs;
}
else if(*(s+i)==2) //2代表*
{
*q=(*q)*molecule[*(p+i+1)];
*(q+1)=*(q+1)*denominator[*(p+i+1)];
yue=G_C_D(*q,*(q+1));
*q=*q/yue;
*(q+1)=*(q+1)/yue;
}
else if(*(s+i)==3) //3代表/
{
*q=(*q)*denominator[*(p+i+1)];
*(q+1)=*(q+1)*molecule[*(p+i+1)];
yue=G_C_D(*q,*(q+1));
*q=*q/yue;
*(q+1)=*(q+1)/yue;
}

}
if(*q/(*(q+1))==24 && *q%(*(q+1))==0) //计算成功则输出式子 (无括号)
{
r=1;
for(i=0;i<=3;i++)
{
printf("%d",molecule[*(p+i)]);
switch(*(s+i))
{
case 0:printf("+");break;
case 1:printf("-");break;
case 2:printf("*");break;
case 3:printf("/");break;
case 4:printf("=");break;
}
}
printf("24\n");
}
}
int same(int *p)
{
int n=0,m=0;
for(m=0;m<=N-1;m++)
for(n=m+1;n<=N-1;n++)
if(*(p+m)==*(p+n)) {return true;break;}

return false;
}

void tw_four(int *p)
{
int sign[N],result[2],*q; //result中保存计算结果的分子与分母
sign[N-1]=4;
for(sign[0]=0;sign[0]<=N-1;sign[0]++) //符号穷举
for(sign[1]=0;sign[1]<=N-1;sign[1]++)
for(sign[2]=0;sign[2]<=N-1;sign[2]++)
{
result[0]=molecule[*p];
result[1]=denominator[*p];
calculate(result,sign,p);
}
}
main()
{
int i,c[N],*p,j;
printf(" ******************************\n");
printf(" * 超级24点 *\n");
printf(" ******************************\n");
printf("输出的表达式中符号优先级一样。\n");
do
{
r=0;
printf("请输入要计算的4个整数:");
for(i=0;i<=3;i++) //输出入数字,使分母初始化都为1
{
scanf("%d",&molecule[i]);
denominator[i]=1;
}
for(c[0]=0;c[0]<=N-1;c[0]++)
for(c[1]=0;c[1]<=N-1;c[1]++)
for(c[2]=0;c[2]<=N-1;c[2]++)
for(c[3]=0;c[3]<=N-1;c[3]++)
if(!same(c)) tw_four(c);
if(r==0) printf("该4个数无法得出24!\n");
printf("继续计算请按1,退出请按0\n");
scanf("%d",&j);
}while(j);
printf("退出成功!\n");
system("pause");
}

搜索更多相关主题的帖子: 输出 
2007-08-20 11:25
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
程序太长,没有看,不好意思

不过我想问下LZ,你这样穷举出来后,比如下面的算式,算出来结果是多少?

1+2*3+4 是等于11还是等于13?

偶学编程,也许本身就是一个错。。。
2007-08-20 12:24
魔城侠客
Rank: 1
等 级:新手上路
帖 子:200
专家分:0
注 册:2006-4-4
收藏
得分:0 
13
因为我没有加入括号

West and east,home is best……
2007-08-20 12:29
noah_shi
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-8-14
收藏
得分:0 
问题关键:对判定式子重复的定义!

4*7-6+2与4*7+2-6这两个式子可以认为重复,
我也可以认为是不重复的,先减6与后减6,运算顺序不同啊,单步得到的结果也不同啊。

所以关键是要把你认为的重复的那种标准,明确得定义下来,然后“告诉电脑”,就可以实现出来了!

2007-08-20 13:33
noah_shi
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-8-14
收藏
得分:0 
太长也没具体看代码,测试结果是错的!

跑了一下,输入5 6 1 2 ,结果是错的。

还是先算对了,再考虑优化吧

2007-08-20 14:06
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
所有可以通过交换律或者结合律或者分配律可以变换出来的式子视为同一解
乘除1和加减0也算同一个运算
2007-08-20 14:10
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
不如大家看看这个做得怎么样:
3MZEfMJL.rar (9.6 KB) 关于计算24点输出式子重复的问题


这是我做的解24点的小程序

[此贴子已经被作者于2007-8-20 14:30:39编辑过]

2007-08-20 14:29
chen7806
Rank: 1
等 级:新手上路
威 望:2
帖 子:160
专家分:0
注 册:2007-8-5
收藏
得分:0 
楼上做得很好呀。非常敬佩,用C写的吗?
2007-08-20 14:46
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
收藏
得分:0 
以下是引用雨中飞燕在2007-8-20 14:29:34的发言:
不如大家看看这个做得怎么样:
[attach]26309[/attach]
这是我做的解24点的小程序

我要学习,你还是学生么?
我们当学生的学的很多,感觉都不精,下学期刚大三,都是专业课 了


惟有学习不断的学习!
2007-08-20 14:53
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
你都大三?应该感到惭愧哦,飞燕刚刚大一~~~~~~~~

偶学编程,也许本身就是一个错。。。
2007-08-20 14:55
快速回复:关于计算24点输出式子重复的问题
数据加载中...
 
   



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

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