拜托大家帮我看看这有什么问题啊,VC检查没问题,可是输出不对 不知道哪里有问题,求大神们帮看看修改下,只能用C语言和数据结构
#include<math.h>#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 4;/*最大输入个数*/
int k=0;/*全局变量 判定是否有解*/
char tp[4]={0},tpt[2000]={0},tptt[2000]={0},tre[2000]={0};/*用来消除重复与记录表达式中的运算符*/
char op[4]={'+','-','*','/'};
void count(float a[],char tem[][25],int n);/*a[]中存放输入的4个数,tem[][25]中存放计算的步骤,n是a[]中元素的个数*/
int q=0,p=0,e=0,w=0,t=0,r=0,g=0,h=0,v=0,u=0,tu=0,te=0;/*用于消除重复*/
float group[2]={0},flow[20]={0},flo[20]={0};
void main()
{
char br=1;
int d;
while (br==1)
{
float number[4];/*放输入的4个数*/
char temp[4][25];/*放表达式,初始化放4个数*/
printf("请输入4个数\n");
for(d=0;d<4;d++)
scanf("%f",&number[d]);
for(d=0;d<4;d++)
{
sprintf(temp[d],"%d",(int) number[d]);
}/*初始化temp[d]*/
count(number,temp,4);/*调用count函数*/
if(k==0)
printf("没有结果\n");
printf("按0结束\n");
scanf("%d",&br);
}
}
void count(float a[],char tem[][25],int n)
{
float b[4];
char tm[4][25];/*b[4]中存放输入的4个数,tm[][25]中存放计算的步骤*/
int i,j,l,x,y;/*i,j用来做双循环,l用来做加减乘除的开关,x,y为后面准备递归数据*/
/*输出部分*/
if(n==1)
{
if(fabs(a[0]-24<0.001))/*要考虑到除法,用fabs函数求绝对值与24比较,相当于等于24时的情况*/
{
/*以下限定输出条件*/
if(tp[3]=='*'&&tp[2]=='*'&&tp[1]=='*')
{
if(te==0)
{
printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
k=1;
te=1;
}
}/*对运算符全为'*'的只输出一遍*/
else if(tp[3]=='+'&&(tp[2]=='+'||tp[0]=='+')&&tp[1]=='+')
{
if(t==0)
{
printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
k=1;
t=1;
}
}/*对运算符全为'+'的只输出一遍*/
else if(tp[3]=='+'&&(tp[2]=='*'||tp[0]=='*')&&tp[1]=='+')
{
if(g==0)
{
printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
k=1;
g=1;
}
}
else if((tp[3]=='-'&&tp[2]=='+')||(tp[3]=='+'&&tp[2]=='-'))
{
if(w==0)
{
printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
k=1;
w=1;
}
}/*对于第二次运算时取到b[0]时,第一第二个运算符是'+','-'或'-','+'的只输出一遍*/
else if(tp[3]=='+'&&tp[2]=='+')
{
if(u==0)
{
printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
k=1;
u=1;
}
}/*对于第二次运算时取到b[0]时,第一第二个运算符都是'+'的只输出一遍*/
else if(tp[3]=='*'&&tp[0]=='*'&&tp[1]=='+')
{
if(tu=0)
{
printf("\n有解为%s=24",tem[0]);/*最后的表达式存在tem[0]中*/
k=1;
tu=1;
}
}
else
{for(h=0;h<q;h++)
{
if(group[0]==flow[h])
{
if(tp[3]==tpt[h])
{
if(tp[2]==tptt[h])
{
if(group[1]==flo[h])
{
if(p==0)
{
printf("\n有解为%s=24",tem[0]);
k=1;
p=1;
}
}
}
}
}
else if(h==q-1)
{
printf("\n有解为%s=24",tem[0]);
k=1;
}
}
}
flo[q]=group[1];/*限定条件初始化*/
flow[q]=group[0];/*限定条件初始化*/
tpt[q]=tp[3];/*限定条件初始化*/
tptt[q]=tp[2];/*限定条件初始化*/
tre[q]=tp[1];/*限定条件初始化*/
tp[3]=0;
tp[2]=0;
tp[1]=0;
tp[0]=0;
q=q+1;
}
}
/*运算部分*/
if(n=1)/*该条件语句用来结束一次递归*/
{
for(i=0;i<n;i++)/*对n个数做'+','-','*','/'遍历*/
{
for(j=0;j<n;j++)
{
if(i=j)
continue;
for(l=0;l<4;l++)/*进行四则运算*/
{
switch(l)
{
case(0):if(n==2)
{
b[0]=a[0]+a[1];
break;
}
else b[0]=a[i]+a[j];
break;
case(1):if(n==2)
{
b[0]=a[0]*a[1];
break;
}
else b[0]=a[i]*a[j];
break;
/*对加和乘做遍历时除去a[i]+a[j]与a[j]+a[i]或a[i]*a[j]与a[j]*a[i]的相同情况*/
case(2):
b[0]=a[i]-a[j];
break;
case(3):
if(a[j]==0)
break;
b[0]=a[i]/a[j];
break;
/*对减和除做遍历时考虑a[i]-a[j]与a[j]-a[i]或a[i]/a[j]与a[j]/a[i]的不同*/
default:break;
}
if(l!=3||a[j]!=0)
{
{
if(l==0||l==2||l==3)/*为递归准备数据(把没用到的数也放到b[]与tm[]中)*/
sprintf(tm[0],"(%s%c%s)",tem[i],op[l],tem[j]);/*用sprintf函数将表达式输入到数组tm[]中,同时把括号也输入tm[]中*/
if(l==1)
sprintf(tm[0],"%s%c%s",tem[i],op[l],tem[j]);
}
{
if(n==3)/*提取第一次运算的运算符和运算结果*/
{
group[1]=b[0];
if(i!=0&&j!=0)
tp[0]=op[l];
else
tp[n-1]=op[l];
}
else if(n==4)/*提取第二次运算的运算符和运算结果*/
{
tp[n-1]=op[l];
group[0]=b[0];
}
else/*提取第三次运算的运算符和运算结果*/
tp[n-1]=op[l];
}
for(x=0,y=1;x<n;x++)/*备份没用到的数据(为递归用)*/
{
if(x!=i&&x!=j)
{
b[y]=a[x];
strcpy(tm[y],tem[x]);/*复制字符串*/
y++;
}
}
}
count(b,tm,n-1);
}
}
}
}
}
[此贴子已经被作者于2016-4-27 13:57编辑过]