c语言程序200行以上,c语言程序 要求源代码有200行以上

该程序旨在生成并验证四个数字(0-9)的组合算式,确保算式正确且结果为24。它通过动态分配内存、组合数计算、算式组合、求解和正确性检查等功能实现这一目标。程序首先对输入的数字进行排序,然后通过递归生成所有可能的算式,接着检查算式的正确性和简洁性,最后输出所有符合要求的算式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;

}

这是我电脑上保存的程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值