刚搜索下论坛贴子,发现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");
}