#includeint zuheshu(float s[],int n); // 组合数的函数
float zuhe[4]={0}; // 暂时存放组合
int sum=0; // 用于计数
// 动态分配n个float变量的数组
float * fsz(int n)
{
return (float *)malloc(sizeof(float)*n);
}
int zuhefu(); //符号组合
int yunsuan(float s[],char p[],int k0[],int k1[]); // 算式组合
float qiujie(float suanshi[],int n); // 算式求解
int hefa(float suanshi[],int r); // 算式正确性检查
float jianjie(float suanshi[],int r); // 算式简洁性检查
int fuhe=0; // 计数符合算式数
void main()
{
// 输入四个数
/*float shu[4]={0};
printf("请输入4个数字(1~10):\n");
scanf("%f",&shu[0]);
scanf("%f",&shu[1]);
scanf("%f",&shu[2]);
scanf("%f",&shu[3]);
//float shu[4]={1,2,3,4};
printf("输入的4个数字依此是: %.0f %.0f %.0f %.0f\n",shu[0],shu[1],shu[2],shu[3]);*/
float s[4]={3,3,3,3},shu[4]={0};
printf("请输入四个数(0-9):\n");
for(int i=0;i<4;i++)
{
scanf("%f",&s[i]);
for(int j=i;j>0;j--)
{
if(s[j]<=s[j-1])
{
float s0=s[j-1];
s[j-1]=s[j];
s[j]=s0;
}
}
}
printf("四个数是:");
for(i=0;i<4;i++)
{
printf("%.0f ",s[i]);
}
printf("\n");
zuheshu(s,4);
printf("有%d个算式符合\n",fuhe);
}
// 组合数,并调用yunsuan
int zuheshu(float s[],int n)
{
if(n==1)
{
zuhe[4-n]=s[0];
zuhefu();
return 1;
}
for(int i=0;i10)
printf("%c",char(suanshi[t]));
else
printf("%0.0f",suanshi[t]);
}
printf("=%0.0f\n",sum0);
}
free(suanshi);
return 1;
}
// 算式正确性检查
int hefa(float suanshi[],int r)
{
float * p=&suanshi[0]; // 为当前指针
float * q=&suanshi[1]; // 为下一指针
int flag=1; // 等式正确标记
while(1)
{
if(*p==40) // 判断是否为'('
{
if((*q>=0)&&(*q<=9))
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
if((*p>=0)&&(*p<=9)) // 判断是否为数
{
if((p-suanshi)>=(r-1))
{
break;
}
if(*q==')'||((*q>41)&&(*q<48))) // '+','-','*','/'在次范围内
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
if(*p==41) // 判断是否为')'
{
if((p-suanshi)>=(r-1))
{
break;
}
if((*q>41)&&(*q<48)) // '+','-','*','/'在次范围内
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
if((*p>41)&&(*p<48)) // // 判断是否为符号
{
if(*q==40||((*q>=0)&&(*q<=9)))
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
}
return flag;
}
// 算式简洁性检查
float jianjie(float suanshi[],int r)
{
float re=1; // 是否括号不影响算式求解
float *p=&re,*q=&re;
int k=0; // 括号数目
int k1=0; // 运算符的个数
float r0=0; // '('前的运算符优先级
float r2=1; // 算式运算符优先级
float r1=0; // ')'后的运算符优先级
int r3=0;
for(int i=0;i=1) // 括号'('外出现减号或除号
{
if((int(r0/100))==1&&(int(re/100))==1) // 括号'('外出现减号,括号内出现+或-
{
continue;
}
else if((int(r0/1000))==1&&(int(re/1000))==1) // 括号'('外出现除号,括号内出现*或/
{
continue;
}
}
if(int(re/100)==1)
re-=100;
if(int(re/1000)==1)
re-=1000;
if(int(r0/100)==1)
r0-=100;
else if(int(r0/1000)==1)
r0-=1000;
if(re==0)
return 0;
if(re>=r0&&re>=r1)
return 0;
}
}
else if(k==0)
{
if(suanshi[i]=='+'||suanshi[i]=='-')
{
r2=((r2*k1)+1)/(++k1);
r3=r3/10+1;
}
else if(suanshi[i]=='*'||suanshi[i]=='/')
{
r2=(r2*k1+2)/(++k1);
r3=r3%10+10;
}
}
}
if(r3%10==1)
r2+=100;
if(r3/10==1)
r2+=1000;
return r2;
}
// 调用函数求解结果为24则输出等式
float qiujie(float suanshi[],int n)
{
if(n==3)
{
float a=0;
switch(char(suanshi[1]))
{
case '+':
return (suanshi[0]+suanshi[2]);
case '-':
return (suanshi[0]-suanshi[2]);
case '*':
return (suanshi[0]*suanshi[2]);
case '/':
return (suanshi[0]/suanshi[2]);
}
}
// 过滤掉括号项
float pq='0';
float * p=&pq; // 指向算式的第一个正括号
float * q=&pq; // 指向算式的与第一个正括号配对的反括号
int k=0;
float suanshi1[7]={'0'}; // 除去括号后的算式
int s=0; // 用来记录suanshi1数组的长度
float sum=0; // 算式的值
for(int m=0;m0)
{
*(q+w)=-1;
}
else
{
*(q+w)=*(q+w+2);
}
}
s=s-2;
m--;
}
else
{
if(m==0)
{
sum+=*p+*q;
}
else
{
sum+=*q;
}
p=p+2;
q=q+2;
}
break;
case '-':
if((s-1)/2!=1&&(suanshi1[2*(m+1)+1]=='*'||suanshi1[2*(m+1)+1]=='/'))
{
*q=qiujie(p+2,3);
int ws=&suanshi1[s-1]-&suanshi1[2*(m+1)];
for(int w=1;w<=ws;w++)
{
if(((q+w+2)-(q+ws))>0)
{
*(q+w)=-1;
}
else
{
*(q+w)=*(q+w+2);
}
}
s=s-2;
m=-1;
}
else
{
if(m==0)
sum+=*p-*q;
else
sum-=*q;
p=p+2;
q=q+2;
}
break;
case '*':
if(m==0)
sum+=(*p)*(*q);
else
sum*=*q;
p=p+2;
q=q+2;
break;
case '/':
if(m==0)
{
sum+=(*p)/(*q);
}
else
{
sum/=*q;
}
p=p+2;
q=q+2;
break;
}
}
}
return sum;
}
这是我电脑上保存的程序