⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p006h.cpp

📁 24点算法。可以计算小数。对非法输入有一定的纠错功能
💻 CPP
字号:
//        +        -        *        /        --        -/
//        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=0;int temp=0;  

void main()
{
 int i,j,k,t,again,res,flag;
 float num[4];
 again=1;
 while(again==1)
{
   printf ("\n Please Enter 4 nums:\n");
   time=0;temp=0;  
   i=0;
   flag=0;
   while (flag==0)
  {
   i++;
   for(i=0;i<4;i++)
   {
    scanf("%f",&num[i]);//输入四个数
    if (num[i]<1 || num[i]>10|| num[i]!=int(num[i]))
    flag++;
   }
  if(flag!=0)
  {
   printf ("Error,please 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 
   time=temp;
   printf ("time=%d",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)//判断结果是否为24
         {
          temp++;
          myPrint(1,i,j,k,a,b,c,d);
         }
       }
      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);
       }
      }

      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);
        }
       }
      }
      if (k==0)//第四种情况:()+()
      {      
	   sum1=myF(i,a,b);
       sum2=myF(j,c,d);
       sum3=sum1+sum2;       
	   if (fabs(sum3-24)<0.1)
       {
        temp++;
        myPrint(4,i,j,k,a,b,c,d);
       }
      }
      if (k==1)//第五种情况:()-() 
      {
       sum1=myF(i,a,b);
       sum2=myF(j,c,d);
       sum3=sum1-sum2;
       if (fabs(sum3-24)<0.1)
        {
         temp++;
         myPrint(5,i,j,k,a,b,c,d);
        }
      }
    }
  if (temp==0)
     return 0;  
  else
     return 1;
}

float myF(int flag,float m,float n)//四则运算 
{        
  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 20000;
      else
          return (m/n);
  if (flag==4)
      return (n-m);
  if (flag==5)
      if (m==0)          return 20000;
      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);
  }
 else
	 if(j==4 || j==5)
        printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],d,sigle[j],c);
     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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -