使用暴力枚举,主函数将四个数进行排列组合,调用calculate函数将运算符进行排列组合,一共有24*64=1536种计算方式。
#include <stdio.h>
#include <string.h>
char four_fun[4]={'+','-','*','/'};
float a[4];
int i,j,k,l;
float calculate(float a,float b,float c,float d);
float one_calculate(float a,float b,char c);
int main()
{
int z;
while(1)
{
for(z=0;z<4;z++)
{
scanf("%f",&a[z]);
printf("ok\n");
}
/*将输入的四个数进行排列组合一共4*3*2*1=24种组合方式*/
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i==j)
{
continue; //跳过已经选择过的数值 跳过a[i],避免重复使用数字
}
else
{
for(k=0;k<4;k++)
{
if((i==k)||(j==k))
{
continue;
}
else
{
for(l=0;l<4;l++)
{
if((i==l)||(j==l)||(k==l))
{
continue;
}
else
{
printf("=%d\n",(int)calculate(a[i],a[j],a[k],a[l]));
//调用计算函数
}
}
}
}
}
}
}
printf(".......................................................\n");//分割线
}
}
float calculate(float a,float b,float c,float d)
{
int i,j,m,n;
float zero_t,one_t,two_t;
/*将运算符进行枚举一共 4*4*4=64种方式*/
for(i=0;i<4;i++)
{
zero_t=one_calculate(a,b,four_fun[i]);
for(j=0;j<4;j++)
{
one_t=one_calculate(zero_t,c,four_fun[j]);
for(m=0;m<4;m++)
{
two_t=one_calculate(one_t,d,four_fun[m]);
if(two_t==24||two_t==-24)//此处为正负24 如果只有+24,例如(5-1/5)*5会计算成((5-1)/5)*5,增加负号会改变(5-1/5)*5中的优先级,变成(1/5-5)*5
if(two_t>0)
{
printf("((%d%c%d)%c%d)%c%d\n",(int)a,four_fun[i],(int)b,four_fun[j],(int)c,four_fun[m],(int)d);//有计算的优先级 例如 1,2,3,4 是((1*2)*3)*4这样的优先级
}
else
{
printf("-(%d%c%d%c%d)%c%d\n",(int)a,four_fun[i],(int)b,four_fun[j],(int)c,four_fun[m],(int)d);
}
return two_t;
}
}
}
}
}
//此函数将ascii码中的加减转换为四则运算 a,b为运算的数字,c为运算符
float one_calculate(float a,float b,char c)
{
float t;
switch(c)
{
case '+':{
t=a+b;
break;
}
case '-':{
t=a-b;
break;
}
case '*':{
t=a*b;
break;
}
case '/':{
t=a/b;
break;
}
default:break;
}
return t;
}
版权声明:本文为qq_45942342原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。