厨师机怎么揉出手套膜:point24 c++

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 05:09:51

// 24点程序1.0版,seuliu,说明:
// 支持计算机出题或者输入4个数字求解(逗号分隔)
// 支持四则运算,最多2对/重括号
// 递归快速算法,全中文注释

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <time.h>

//24点程序,一括号位置有12,13,14(无括号),23,24,34,运算符号有+-*/四种
double fStack[8];//操作数栈
int cStack[8];//操作符栈
int nFTop=0;
int nCTop=0;
int FindNum=0;
int printon=1;
#define fabs(x) ((x>0)?x:-x)

//双目基本运算
int cal(double a, double b, int c, double* fAns)
{
switch(c)
{
case 1:
*fAns=a+b;
break;
case 2:
*fAns=a-b;
break;
case 3:
*fAns=a*b;
break;
case 4:
if(b!=0)
*fAns=a/b;
else
return -1;
break;
}
return 0;
}

//堆栈法求算术表达式的值
double run(double n[5], int b[3], int c[5])
{
memset(fStack,0,8*sizeof(double));
nFTop=0;
memset(cStack,0,8*sizeof(int));
nCTop=0;
//遍历4位数
if(c[1]==2)
n[1]=-fabs(n[1]);
else
n[1]=fabs(n[1]);
fStack[++nFTop]=n[1];//第一个操作数压栈;
cStack[++nCTop]=1;//第一个操作符总为1

if(1==b[1])
{
cStack[++nCTop]=-1;//运算符栈=-1表示括号,再次遇到括号时,运算将持续到此处
}
for(int i=2; i<=4; i++)
{
fStack[++nFTop]=n[i];
cStack[++nCTop]=c[i];
if(i==b[1])//左括号,入运算符栈
{
cStack[++nCTop]=-1;
}
if(i==b[2])//右括号,从最顶层弹出栈计算
{
//如果是括号内全是乘除法,直接跳过不做(非法表达式)
if (((c[i]>=3)&&(i-1==b[1]))||((c[i]>=3)&&(c[i-1]>=3)&&(i-2==b[1])))
{
return 0;
}
while(cStack[nCTop]!=-1)
{
if (cStack[nCTop-1]==2)//如果前一次运算是减法,当前加减运算换方向,乘除不变
{
int nCC=(cStack[nCTop]<3)?(cStack[nCTop]^0x03):cStack[nCTop];
if (cal(fStack[nFTop-1],fStack[nFTop],nCC,&fStack[nFTop-1])!=0)
{
return -1;
}
}else if(cal(fStack[nFTop-1],fStack[nFTop],cStack[nCTop],&fStack[nFTop-1])!=0)
return -1;
nFTop--;
nCTop--;
}
nCTop--;//弹出左括号
}
if(cStack[nCTop]>=3)//乘除法优先运算,提前弹出运算符
{
if(i!=b[1])//不是左括号
{
if(cal(fStack[nFTop-1],fStack[nFTop],cStack[nCTop--],&fStack[nFTop-1]))
return -1;
nFTop--;
}
}
}
while(nFTop>1)
{
if (cStack[nCTop-1]==2)//如果前一次运算是减法,当前加减运算换方向,乘除不变
{
int nCC=(cStack[nCTop]<3)?(cStack[nCTop]^0x03):cStack[nCTop];
if (cal(fStack[nFTop-1],fStack[nFTop],nCC,&fStack[nFTop-1])!=0)
return -1;
}else if(cal(fStack[nFTop-1],fStack[nFTop],cStack[nCTop],&fStack[nFTop-1])!=0)
return -1;
nFTop--;
nCTop--;
}
return fStack[1];
}

//固定括号在2、4位置的运算,c的每一位只有两种可能即 +-,+-,*/,+-
double run2(double n[5], int c[5])
{
n[1]=fabs(n[1])*(3-c[1]*2);
double f1=0,f2=0,fAns=0;
cal(n[1],n[2],c[2],&f1);
cal(n[3],n[4],c[4],&f2);
if(cal(f1,f2,c[3],&fAns)==0)
return fAns;
return -1;
}
void disp2(double n[5],int c[5])
{
char co[6]=" +-*/";
if (printon==1)
printf("(%d%c%d)%c(%d%c%d)=24\n",(int)n[1],co[c[2]],(int)n[2],co[c[3]],(int)n[3],co[c[4]],(int)n[4]);
FindNum=1;
}
void fun2(double n[5])
{
int c[5];
for (int i=0; i<16; i++)
{
c[1]=i/8+1;
c[2]=(i%8)/4+1;
c[3]=(i%4)/2+3;
c[4]=i%2+1;
if(run2(n,c)==24)
disp2(n,c);
}
}
void disp(double n[5], int b[3], int c[5])
{
char co[6]=" +-*/";
if (printon==1)
{
for (int i=1; i<=4; i++)
{
if(i>=2)
printf("%c",co[c[i]]);
if (i==b[1])
{
printf("(");
}
printf("%d",(int)n[i]);
if (i==b[2])
{
printf(")");
}
}
printf("=24\n");
}
FindNum=1;
}
//递归遍历所有运算符。
int funa(double n[5], int b[3], int c[5], int nCDeep)
{
int nLoop=(nCDeep==1)?2:4;//第一位仅仅+-两种符号需要穷举
for(c[nCDeep]=1; c[nCDeep]<=nLoop; c[nCDeep]++)
{
if(nCDeep<4)
funa(n,b,c,nCDeep+1);
else
{//开始运算,b中是括号起止位置,c中是运算符
double ans=run(n,b,c);
if (ans==24)
{
// printf("%d,%d,%d,%d,%d,%d,\n",b[1],b[2],c[1],c[2],c[3],c[4]);
disp(n,b,c);
}
}
}
return 0;
}

//递归遍历所有括号
int fun(double n[5], int b[3]/*括号位置*/, int nBDeep/*括号递归深度*/,int nStart/*括号起始位置*/)
{
//括号内的数先算,运算次序按照c[5]对应。c的对应关系是1--加,2--减,3--乘,4--除
for(b[nBDeep]=nStart; b[nBDeep]<=4; b[nBDeep]++)
{
if(nBDeep<2)
fun(n, b, nBDeep+1, b[nBDeep]+1);
else//现在有括号的穷举了.下面开始穷举运算符
{
int c[5]={0,0,0,0,0};
funa(n,b,c,1);
}
}
return 0;
}
int main(int argc, char *argv[])
{
//二括号位置有12-34,单独处理
double n[5]={0,2,3,5,6};
int b[3]={0,2,3};
int c[5]={0,1,3,1,1};
char cAgain='r', cTemp=' ';
srand((unsigned)time( NULL ));
printf("24 Point. 2005.10.16.13:00-15:00. Rik. \nPressing 'y' at moment of inquiring will input your question\n");
while ((cAgain!='n') && (cAgain!='N'))
{
if (cAgain=='y'||cAgain=='Y')
{
FindNum=0;
printf("Input 4 intergers, separated by comma:");
scanf("%lf,%lf,%lf,%lf",&n[1],&n[2],&n[3],&n[4]);
fun(n,b,1,1);
fun2(n);
if (FindNum==0)
{
printf("No solution.\n\n");
}
}
else
{
FindNum=0;
while (FindNum==0)
{
for (int i=1; i<=4; i++)
{
n[i]=(int)(rand()*1.0/RAND_MAX*16);
}
printon=0;
fun(n,b,1,1);
fun2(n);
n[1]=fabs(n[1]);
printon=1;
}
printf("%.0lf %.0lf %.0lf %.0lf = 24 (Enter)",n[1],n[2],n[3],n[4]);

fflush(stdin);
scanf("%c",&cTemp);
fflush(stdin);

fun(n,b,1,1);
fun2(n);
}

printf("continue?(y/n/Enter):");

fflush(stdin);
scanf("%c",&cAgain);
fflush(stdin);
}
return 0;
}

真是厉害
佩服,佩服
只是main函数的第一个for循环的循环体中
if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
后面的数据类型强制转换应该是(int)num[i]
即应该改成
if (num[i]<1 || num[i]>13 || num[i]!=(int)num[i])
否则无法运行

//以下为24点程序//
// + - * / -- -/
// 0 1 2 3 4 5

#include<stdio.h>
#include<math.h>

int treat(float a,float b,float c,float d);
float myF(int flag,float m,float n);
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d);

int time,temp=0;
void main()
{
int i,j,k,t,again,res,flag;
float num[4];
again=1;
while(again==1)
{
printf ("\nPlease Enter 4 nums(1~13):\n");
i=0;
flag=0;
while (flag==0)
{
i++;
// printf ("Input num-%d\n",i);
for(i=0;i<4;i++)
{
scanf("%f",&num[i]);
if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
flag++;
}
if(flag!=0)
{
printf ("Error input again\n",i);
flag=0;
}
else
flag=1;
}
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (j!=i)
for (k=0;k<4;k++)
if (k!=j && k!=i)
for (t=0;t<4;t++)
if (t!=i && t!=j && t!=k)
{
res=treat(num[i],num[j],num[k],num[t]);
}
if (res==0)
printf ("\nNo answer\n");
else ;
// printf ("time=%d\n\n",time);
printf ("\n1: Go on\n2: Quit\n");
scanf ("%d",&again);
}
}

int treat(float a,float b,float c,float d)
{
int i,j,k;
float sum1,sum2,sum3;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
for (k=0;k<6;k++)
{
if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0)))
{
sum1=myF(i,a,b);
sum2=myF(j,sum1,c);
sum3=myF(k,sum2,d);
if (fabs(sum3-24)<0.1)
{
temp++;
myPrint(1,i,j,k,a,b,c,d);
// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("1:myF(%d,myF(%d,myF(%d,%2.0f,%2.0f),%2.0f),%2.0f) sum3=%f\n\n",k,j,i,a,b,c,d,sum3);
}
}
if (k==2)
{
sum1=myF(i,a,b);
sum2=myF(j,c,d);
sum3=sum1*sum2;
if (fabs(sum3-24)<0.1)
{
temp++;
myPrint(2,i,j,k,a,b,c,d);
// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("2:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f)) sum3=%f\n\n",k,i,a,b,j,c,d,sum3);
}
}

if (k==3)
{
sum1=myF(i,a,b);
sum2=myF(j,c,d);
if (sum2!=0)
{
sum3=sum1/sum2;
if (fabs(sum3-24)<0.1)
{
temp++;
myPrint(3,i,j,k,a,b,c,d);
// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("3:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f)) sum3=%f\n\n",k,i,a,b,j,c,d,sum3);
}
}
}
}
if (temp==0)
return 0;
else
return 1;
}

float myF(int flag,float m,float n)
{
// time++;
if (flag==0)
return (m+n);
if (flag==1)
return (m-n);
if (flag==2)
return (m*n);
if (flag==3)
if (n==0)
return 30000;
else
return (m/n);
if (flag==4)
return (n-m);
if (flag==5)
if (m==0)
return 30000;
else
return (n/m);
return 0;
}

void myPrint(int type,int i,int j,int k,float a,float b,float c,float d)
{
char sigle[6];
sigle[0]='+';
sigle[1]='-';
sigle[2]='*';
sigle[3]='/';
sigle[4]='-';
sigle[5]='/';
if (type==1){
if(j==4 || j==5)
{
if (k==4 || k==5)
printf("%2.0f %c (%2.0f %c (%2.0f %c %2.0f)) =24\n",d,sigle[k],c,sigle[j],a,sigle[i],b);
else
printf("(%2.0f %c (%2.0f %c %2.0f)) %c %2.0f =24\n",c,sigle[j],a,sigle[i],b,sigle[k],d);
}
else if (k==4 || k==5)
{
printf("%2.0f %c ((%2.0f %c %2.0f) %c %2.0f) =24\n",d,sigle[k],a,sigle[i],b,sigle[j],c);
}
else
printf("((%2.0f %c %2.0f) %c %2.0f) %c %2.0f =24\n",a,sigle[i],b,sigle[j],c,sigle[k],d);
}
if (type==2 || type==3)
{
// if (k==4 || k==5)
// printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f)=24\n",c,sigle[j],d,sigle[k],a,sigle[i],b);
// else
printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);
}
}

望采纳!!!

真是高手,小弟佩服