第2个回答 推荐于2016-01-01
把随机生成的四个数放到数组里,判断加起来等于24就好;
参考代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define LING 1E-6
#define CONT 4
#define VOLUE 24
float number[CONT];
char expression[CONT][20] ;
bool m_judge = false; //判断是否有解。
int count = 0;
void Find(int n)
{
int i = 0, j = 0;
if (n == 1)
{
if ( fabs(number[0] - 24) <= LING)
{
for (i = 0; i < 20; i++)
{
printf("%c", expression[0][i]) ;
}
printf("\t\t") ;
m_judge = true;
count ++;
if((count % 2)==0) //使输出时每行三个表达式
printf("\n") ;
}
else
{ }
}
for(i = 0; i < n; i++) //查找
{
for (j = i + 1; j < n; j++) //与其后面的查找进行计算
{
float a, b;
char expressiona[20], expressionb[20];
a = number[i] ;
b = number[j] ;
number[j] = number[n - 1];
strcpy(expressiona, expression[i]) ;
strcpy(expressionb, expression[j]) ;
strcpy(expression[j], expression[n - 1]) ;
sprintf(expression[i], "(%s+%s)", expressiona, expressionb) ;
number[i] = a + b;
Find(n-1);
///////////////////////////////////
sprintf(expression[i], "(%s-%s)", expressiona, expressionb) ;
number[i] = a - b;
Find(n-1);
sprintf(expression[i], "(%s-%s)", expressionb, expressiona) ;
number[i] = b - a;
Find(n-1);
sprintf(expression[i], "(%s*%s)", expressiona, expressionb) ;
number[i] = a * b;
Find(n-1);
if (b != 0)
{
sprintf(expression[i], "(%s/%s)", expressiona, expressionb) ;
number[i] = a / b;
Find(n-1);
}
if (a != 0)
{
sprintf(expression[i], "(%s/%s)", expressionb, expressiona) ;
number[i] = b / a;
Find(n-1);
}
number[i] = a; // 最后一层的Find(2)调用完成后将a重新赋值给number[i]即number[0]
number[j] = b; // 最后一层的Find(2)调用完成后将b重新赋值给nubmer[j]即number[1]
strcpy(expression[i], expressiona) ;
strcpy(expression[j], expressionb) ;
}
}
}
int main()
{
int i, j ;
printf("请输入四个数:\n") ;
for (i = 0; i < CONT; i++)
{
char ch[20], s;
int a ;
printf("第%d个数:", i+1) ;
scanf("%f", &number[i]) ;
a = (int)number[i] ;
s = char(a + 48);
ch[0] = s ;
for (j = 1; j < 20; j++)
{
ch[j] = 0 ;
}
strcpy(expression[i], ch) ;
}
printf("\n") ;
Find(CONT) ;
if(m_judge==true)
{
printf("\n\n成功!\n") ;
printf("总共的计算方法共有:%d\n", count) ;
}
else
{
printf("失败!") ;
}
return 0;
}
第3个回答 2010-04-01
#include<stdio.h>
#define C case
double fun(double a1,double a2,int b)
{switch(b)
{C 0:return (a1+a2);
C 1:return (a1-a2);
C 2:return (a1*a2);
C 3:return (a1/a2);
}
}
void main()
{ int g;
for(g=0;g<100;)
{int i,j,k,l,n,m,r,save[4];
double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;
char sign[5]="+-*/";
printf("请输入4个数,数字与数字之间用空格隔开:");
for(i=0;i<4;i++)
{scanf("%lf",num+i); save[i]=num[i];}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(j!=i)
{for(k=0;k<4;k++)
if(k!=i&&k!=j)
{for(l=0;l<4;l++)
if(l!=i&&l!=j&&l!=k)
{for(n=0;n<4;n++)
for(m=0;m<4;m++)
for(r=0;r<4;r++)
{tem1=fun(num[i],num[j],n);
tem2=fun(tem1,num[k],m);
tem3=fun(tem2,num[l],r);
if(tem3==24.0)printf("{(%d%c%d)%c%d}%c%d=24\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
else if(tem3==-24.0)printf("{%d%c(%d%c%d)}%c%d=24\n",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);
else if(tem3==1.0/24.0)printf("%d%c{(%d%c%d)%c%d}=24\n",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);
else if(tem3==-1.0/24.0)printf("%d%c{%d%c(%d%c%d)}=24\n",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]);
else
{tem1=fun(num[i],num[j],n);
tem2=fun(num[k],num[l],r);
tem3=fun(tem1,tem2,m);
if(tem3==24.0) printf("(%d%c%d)%c(%d%c%d)=24\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
}
}
}
}
}
g++;
}
}