回 帖 发 新 帖 刷新版面

主题:24点问题

不知道你玩过24点吗?就是任意给你4个数字,你用+,-,*,/运算符去得到24。
  有兴趣的试试看呢,我是没思考出来,高手来指教!

回复列表 (共17个回复)

11 楼

sprintf(cx[i],"%d",(int)num[i]);请问楼主为什么要把书转化成int我认为没必要~~~~本人初学者,希望楼主指教~~

12 楼

#include<iostream.h>
#include<stdlib.h>

float a[4]={0},sum=0.0;

float opertar(int a,int b,int c)
  {switch(a)
     {case 0:sum=a[i]+a[j];break;
      case 1:sum=a[i]-a[j];break;
      case 2:sum=a[i]*a[j];break;
      case 3:sum=a[i]/a[j];break;}
  switch(b)
     {case 0:sum=sum+a[k];break;
      case 1:sum=sum-a[k];break;
      case 2:sum=sum*a[k];break;
      case 3:sum=sum/a[k];break;}
  switch(c)
     {case 0:sum=sum+a[m];break;
      case 1:sum=sum-a[m];break;
      case 2:sum=sum*a[m];break;
      case 3:sum=sum/a[m];break;}
  return sum;}

void main()
{int i,j,k,m;
  
  srand(_TIME_);
  for(i=0;i<4;i++) a[i]=rand()+1;      //产生四个大于零的随机数
   
  for(i=0;i<4;i++)
   for(j=0;j<4;i++)
    for(k=0;k<4;i++)
     for(m=0;m<4;i++){
       (i==j)||(i==k)||(i==m)||(j==k)||(j==m)||(k==m)?continue:
        for(i=0;i<4;i++)
         for(j=0;j<4;j++)
          for(k=0;k<4;k++)
           opertar(i,j,k)==24.0?cout<<a[i], i==0?cout<<"+":i==1?cout<<"-":i==2?cout<<"*":i==3?cout<<"/",cout<<a[j], j==0?cout<<"+":j==1?cout<<"-":j==2?cout<<"*":j==3?cout<<"/",cout<<a[k], k==0?cout<<"+":k==1?cout<<"-":k==2?cout<<"*":k==3?cout<<"/",cout<<a[m]<<"=24",break;
}}

13 楼

zzz

14 楼

我的程序虽然长了点,可是他可以输出所有可能的排列,而且去掉了部分多余的括号,大家有兴趣的侃侃!
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 30

void  Print(char exp[], int len, FILE *fp);/*输出表达式,并存储在文件中*/
int Change(char str[], char exp[]);/*将一般表达式转化为逆波兰表达式*/
int JiSuan(char exp[]); /*求逆波兰表达式的值*/

int main(void)
{
    char *pstr, str[MAX];/*存储原算术表达式*/  
   char *pexp, exp[MAX];/*存储转化成的逆波兰表达式*/
   char fuhao[4]={'+','-','*','/'};/*存储运算符号*/
   char leftch[2]={' ','('};/*存储左括号*/
   char rightch[2]={' ',')'}; /*存储右括号*/
   int  num[4];
   int xuhao[12]={0};
   int result;   /*存储逆波兰表达式的值*/
   int len, i, j, k;
   int sum1, sum2, l1, l2, l3, l4, r1, r2, r3, r4;
   FILE *fp;
   
   pstr=str;
   pexp=exp;
  
   if ( (fp=fopen("cccc.txt","w+")) == NULL)
    {
       fprintf(stderr,"\nError opening file .\n");
       exit(1);
    }
   for(int i=0; i<4; i++)
   {
      fprintf(stdout, "请从0-9中选择一个数字输入:");
      scanf("%d",&num[i]);  
   }    
      for(int i=0; i<4; i++)
      {
          fprintf(fp, "num[%d]=%d\t", i, num[i]);
       fprintf(stdout, "num[%d]=%d\t", i, num[i]);  
   }       
   fprintf(fp, "\n");
   fprintf(stdout, "\n");
    system("pause");    

15 楼

接主程序部分:
for(xuhao[0]=0; xuhao[0]<2; xuhao[0]++)/*用穷举法列出所有可能的算式*/
   {
      str[0]=leftch[xuhao[0]];   /*为提高效率,先列出左右括号存在的可能情况,最多有3个左括号3个右括号*/
      if(str[0] == '(')/*判断第一个左括号是否存在*/
          l1=1;
         else
             l1=0;
         
         for(xuhao[1]=0; xuhao[1]<2; xuhao[1]++)
      {
         str[3]=leftch[xuhao[1]];
         if(str[3] == '(')/*判断第二个左括号是否存在*/
               l2=1;
            else
                l2=0;
      
            for(xuhao[2]=0; xuhao[2]<2; xuhao[2]++)
         {
            str[7]=leftch[xuhao[2]];
            if(str[7] == '(')/*判断第三个左括号是否存在*/
                  l3=1;
               else
                   l3=0;
             for(xuhao[3]=0; xuhao[3]<2; xuhao[3]++)
               {
                  str[5]=rightch[xuhao[3]];
                  if(str[5] == ')')/*判断第一个右括号是否存在*/
                        r1=1;
                     else
                         r1=0;
         
                     for(xuhao[4]=0; xuhao[4]<2; xuhao[4]++)
                  {
                     str[9]=rightch[xuhao[4]];
                     if(str[9] == ')')/*判断第二个右括号是否存在*/
                           r2=1;
                        else
                            r2=0;
                      
                        for(xuhao[5]=0; xuhao[5]<2; xuhao[5]++)
                     {
                        str[12]=rightch[xuhao[5]];
                        if(str[12] == ')')/*判断第三个右括号是否存在*/
                            r3=1;
                           else
                               r3=0;    
                           sum1=l1+l2+l3;/*计算左括号的总的个数*/
                           sum2=r1+r2+r3;/*计算右括号的总的个数*/
                              if(sum1 == sum2)/*只有左括号的个数等于括号的个数时才进行计算*/
                               for(xuhao[6]=0; xuhao[6]<4; xuhao[6]++)/*列出每个运算符号的可能情况*/
                              {
                                 str[2]=fuhao[xuhao[6]];
                                 for(xuhao[7]=0; xuhao[7]<4; xuhao[7]++)
                                 {
                                    str[6]=fuhao[xuhao[7]];
                                    for(xuhao[8]=0; xuhao[8]<4; xuhao[8]++)
                                    {
                                       str[10]=fuhao[xuhao[8]];
                                       for(i=0; i<4; i++)/*列出每个数字可能出现的排列情况*/
                                       {
                                          str[1]=(char)(num[i]+48);
                                          for(j=0; j<4; j++)
                                             if(i != j)
                                             {
                                                str[4]=(char)(num[j]+48);
                                                for(k=0; k<4; k++)
                                                if(i != k && j != k)
                                                {
                                                   str[8]=(char)(num[k]+48);
                                                   str[11]=(char)(num[6-i-j-k]+48);
                                                   str[13]='#';
                                                   len=Change(pstr, pexp);/*将一般表达式转化为逆波兰表达式*/
                                                     if(-1 == len)/*根据len的返回值决定是否进行计算,-1 == len表示出现错误*/
                                                       ;
                                                     else
                                                   {
                                                      result=JiSuan(pexp);/*根据result的返回值决定是否进行输出*/
                                                      if(12345 ==  result)/*12345 ==  result表示出现错误*/
                                                           ;
                                                      else if( 24 == result)
                                                      {  
                                                         if(str[3] == '(' && str[5] == ')'
                                                             || str[7] == '(' && str[9] == ')')/*去掉多余的括号,如(4)*/
                                                                 ;
                                                            else
                                                            {
                                                               fprintf(fp, "正确的算术表达式: ");
                                                            fprintf(stdout, "正确的算术表达式: ");
                                                            Print(pstr, 14, fp);/*输出正确的算术表达式,并存储在文件中*/
           }}}}}}}}}}}}}}}
   fclose(fp);  
   system("pause");
   return 0;
}

16 楼

以下是子程序:
void  Print(char exp[], int len, FILE *fp)
{
   int i;
   
    for(i=0; i<len; i++)
    {
        fprintf(fp, "%c", exp[i]);
        fprintf(stdout, "%c", exp[i]);
    }
    printf("\n");
}  

int Change(char str[], char exp[])
{
    int i, t, top;/*t作为exp的下标,top作为stack的下标,i作为str的下标*/
    char stack[MAX], ch;/*作为饯使用*/
    
    t=0;
   i=0;
   top=0;
   stack[0]='#';
   ch=str[i++];
   while(ch != '#')
   {
      if(ch >= '0' && ch <= '9')
          exp[t++]=ch;
         else if(ch == '(')
             stack[++top]=ch;
         else if(ch == ')')
         {
            while(stack[top] != '(' && top > 0)
                exp[t++]=stack[top--];
            if(top == 0)/*表示没有对应的 ')'*/
              return  -1;
            top--;
         }
      else if(ch == '+' || ch == '-')
      {
         while(top != 0 && stack[top] != '(')
             exp[t++]=stack[top--];
            stack[++top]=ch;
      }   
      else if(ch == '*' || ch == '/')
      {
         while(stack[top] == '*' || stack[top] == '/')
               exp[t++]=stack[top--];
            stack[++top]=ch;
      }   
      
      ch=str[i++];     
   }  
   
    while(top != 0)
   {
      if('(' == stack[top])/*表示有多余的 '(' */
          return  -1;
         else
             exp[t++]=stack[top--];
   }   
   exp[t]='#';
   return t+1;
}

int JiSuan(char exp[])
{
   int stack[MAX], d;/*作为饯使用*/
   char c;
   int i=0, t=0, top=0;

   c=exp[t++];
   while(c != '#')
   {
      d=c-'0';
      if(c >= '0' && c <= '9')
          stack[top++]=d;
         else
         {
            switch(c)
            {
               case '+': stack[top-2]=stack[top-2]+stack[top-1];
                            break;
                 case '-': stack[top-2]=stack[top-2]-stack[top-1];
                            break;
               case '*': stack[top-2]=stack[top-2]*stack[top-1];
                            break;
            case '/': if(stack[top-1] != 0 && stack[top-2]%stack[top-1] == 0 )
                                    stack[top-2]=stack[top-2]/stack[top-1];/*前后两个数必须能整除,且分母不为0*/
                                else                          /*否则返回值12345(表示无效)*/
                                    return 12345;
                            break;                 
            }  
         top--;
         }  
      c=exp[t++];
   }
   return stack[top-1];
}

17 楼

num[0]=1    num[1]=3    num[2]=5    num[3]=9    
正确的算术表达式:  9+ 1 * 3 *5 #正确的算术表达式:  9+ 1 * 5 *3 #正确的算术表达式:  9+ 3 * 1 *5 #正确的算术表达式:  9+ 3 * 5 *1 #正确的算术表达式:  9+ 5 * 1 *3 #正确的算术表达式:  9+ 5 * 3 *1 #正确的算术表达式:  9+ 3 * 5 /1 #正确的算术表达式:  9+ 5 * 3 /1 #正确的算术表达式:  9+ 3 / 1 *5 #正确的算术表达式:  9+ 5 / 1 *3 #正确的算术表达式:  1* 9 + 3 *5 #正确的算术表达式:  1* 9 + 5 *3 #正确的算术表达式:  3* 5 + 1 *9 #正确的算术表达式:  3* 5 + 9 *1 #正确的算术表达式:  5* 3 + 1 *9 #正确的算术表达式:  5* 3 + 9 *1 #正确的算术表达式:  9* 1 + 3 *5 #正确的算术表达式:  9* 1 + 5 *3 #正确的算术表达式:  3* 5 + 9 /1 #正确的算术表达式:  5* 3 + 9 /1 #正确的算术表达式:  1* 3 * 5 +9 #正确的算术表达式:  1* 5 * 3 +9 #正确的算术表达式:  3* 1 * 5 +9 #正确的算术表达式:  3* 5 * 1 +9 #正确的算术表达式:  5* 1 * 3 +9 #正确的算术表达式:  5* 3 * 1 +9 #正确的算术表达式:  3* 5 / 1 +9 #正确的算术表达式:  5* 3 / 1 +9 #正确的算术表达式:  9/ 1 + 3 *5 #正确的算术表达式:  9/ 1 + 5 *3 #正确的算术表达式:  3/ 1 * 5 +9 #正确的算术表达式:  5/ 1 * 3 +9 #正确的算术表达式:  9+ 1 *(3 *5)#正确的算术表达式:  9+ 1 *(5 *3)#正确的算术表达式:  9+ 3 *(1 *5)#正确的算术表达式:  9+ 3 *(5 *1)#正确的算术表达式:  9+ 5 *(1 *3)#正确的算术表达式:  9+ 5 *(3 *1)#正确的算术表达式:  9+ 3 *(5 /1)#正确的算术表达式:  9+ 5 *(3 /1)#正确的算术表达式:  1* 9 +(3 *5)#正确的算术表达式:  1* 9 +(5 *3)#正确的算术表达式:  3* 5 +(1 *9)#正确的算术表达式:  3* 5 +(9 *1)#正确的算术表达式:  5* 3 +(1 *9)#正确的算术表达式:  5* 3 +(9 *1)#正确的算术表达式:  9* 1 +(3 *5)#正确的算术表达式:  9* 1 +(5 *3)#正确的算术表达式:  3* 5 +(9 /1)#正确的算术表达式:  5* 3 +(9 /1)#正确的算术表达式:  9/ 1 +(3 *5)#正确的算术表达式:  9/ 1 +(5 *3)#正确的算术表达式:  9+(1 * 3 *5)#正确的算术表达式:  9+(1 * 5 *3)#正确的算术表达式:  9+(3 * 1 *5)#正确的算术表达式:  9+(3 * 5 *1)#正确的算术表达式:  9+(5 * 1 *3)#正确的算术表达式:  9+(5 * 3 *1)#正确的算术表达式:  9+(3 * 5 /1)#正确的算术表达式:  9+(5 * 3 /1)#正确的算术表达式:  9+(3 / 1 *5)#正确的算术表达式:  9+(5 / 1 *3)#正确的算术表达式:  1*(9 + 3 *5)#正确的算术表达式:  1*(9 + 5 *3)#正确的算术表达式:  1*(3 * 5 +9)#正确的算术表达式:  1*(5 * 3 +9)#正确的算术表达式:  9+(1 * 3)*5 #正确的算术表达式:  9+(1 * 5)*3 #正确的算术表达式:  9+(3 * 1)*5 #正确的算术表达式:  9+(3 * 5)*1 #正确的算术表达式:  9+(5 * 1)*3 #正确的算术表达式:  9+(5 * 3)*1 #正确的算术表达式:  9+(3 * 5)/1 #正确的算术表达式:  9+(5 * 3)/1 #正确的算术表达式:  9+(3 / 1)*5 #正确的算术表达式:  9+(5 / 1)*3 #正确的算术表达式:  1*(3 * 5)+9 #正确的算术表达式:  1*(5 * 3)+9 #正确的算术表达式:  3*(1 * 5)+9 #正确的算术表达式:  3*(5 * 1)+9 #正确的算术表达式:  5*(1 * 3)+9 #正确的算术表达式:  5*(3 * 1)+9 #正确的算术表达式:  3*(5 / 1)+9 #正确的算术表达式:  5*(3 / 1)+9 #正确的算术表达式: (9+ 1 * 3 *5)#正确的算术表达式: (9+ 1 * 5 *3)#正确的算术表达式: (9+ 3 * 1 *5)#正确的算术表达式: (9+ 3 * 5 *1)#正确的算术表达式: (9+ 5 * 1 *3)#正确的算术表达式: (9+ 5 * 3 *1)#正确的算术表达式: (9+ 3 * 5 /1)#正确的算术表达式: (9+ 5 * 3 /1)#正确的算术表达式: (9+ 3 / 1 *5)#正确的算术表达式: (9+ 5 / 1 *3)#正确的算术表达式: (1* 9 + 3 *5)#正确的算术表达式: (1* 9 + 5 *3)#正确的算术表达式: (3* 5 + 1 *9)#正确的算术表达式: (3* 5 + 9 *1)#正确的算术表达式: (5* 3 + 1 *9)#正确的算术表达式: (5* 3 + 9 *1)#正确的算术表达式: (9* 1 + 3 *5)#正确的算术表达式: (9* 1 + 5 *3)#正确的算术表达式: (3* 5 + 9 /1)#正确的算术表达式: (5* 3 + 9 /1)#正确的算术表达式: (1* 3 * 5 +9)#正确的算术表达式: (1* 5 * 3 +9)#正确的算术表达式: (3* 1 * 5 +9)#正确的算术表达式: (3* 5 * 1 +9)#正确的算术表达式: (5* 1 * 3 +9)#正确的算术表达式: (5* 3 * 1 +9)#正确的算术表达式: (3* 5 / 1 +9)#正确的算术表达式: (5* 3 / 1 +9)#正确的算术表达式: (9/ 1 + 3 *5)#正确的算术表达式: (9/ 1 + 5 *3)#正确的算术表达式: (3/ 1 * 5 +9)#正确的算术表达式: (5/ 1 * 3 +9)#正确的算术表达式: (9+ 3 * 5)*1 #正确的算术表达式: (9+ 5 * 3)*1 #正确的算术表达式: (9+ 3 * 5)/1 #正确的算术表达式: (9+ 5 * 3)/1 #正确的算术表达式: (3* 5 + 9)*1 #正确的算术表达式: (5* 3 + 9)*1 #正确的算术表达式: (3* 5 + 9)/1 #正确的算术表达式: (5* 3 + 9)/1 #正确的算术表达式: (1* 3 * 5)+9 #正确的算术表达式: (1* 5 * 3)+9 #正确的算术表达式: (3* 1 * 5)+9 #正确的算术表达式: (3* 5 * 1)+9 #正确的算术表达式: (5* 1 * 3)+9 #正确的算术表达式: (5* 3 * 1)+9 #正确的算术表达式: (3* 5 / 1)+9 #正确的算术表达式: (5* 3 / 1)+9 #正确的算术表达式: (3/ 1 * 5)+9 #正确的算术表达式: (5/ 1 * 3)+9 #正确的算术表达式: (1* 9)+ 3 *5 #正确的算术表达式: (1* 9)+ 5 *3 #正确的算术表达式: (3* 5)+ 1 *9 #正确的算术表达式: (3* 5)+ 9 *1 #正确的算术表达式: (5* 3)+ 1 *9 #正确的算术表达式: (5* 3)+ 9 *1 #正确的算术表达式: (9* 1)+ 3 *5 #正确的算术表达式: (9* 1)+ 5 *3 #正确的算术表达式: (3* 5)+ 9 /1 #正确的算术表达式: (5* 3)+ 9 /1 #正确的算术表达式: (1* 3)* 5 +9 #正确的算术表达式: (1* 5)* 3 +9 #正确的算术表达式: (3* 1)* 5 +9 #正确的算术表达式: (3* 5)* 1 +9 #正确的算术表达式: (5* 1)* 3 +9 #正确的算术表达式: (5* 3)* 1 +9 #正确的算术表达式: (3* 5)/ 1 +9 #正确的算术表达式: (5* 3)/ 1 +9 #正确的算术表达式: (9/ 1)+ 3 *5 #正确的算术表达式: (9/ 1)+ 5 *3 #正确的算术表达式: (3/ 1)* 5 +9 #正确的算术表达式: (5/ 1)* 3 +9 #正确的算术表达式: (1- 5)*(3 -9)#正确的算术表达式: (3- 9)*(1 -5)#正确的算术表达式: (5- 1)*(9 -3)#正确的算术表达式: (9- 3)*(5 -1)#正确的算术表达式: (1* 9)+(3 *5)#正确的算术表达式: (1* 9)+(5 *3)#正确的算术表达式: (3* 5)+(1 *9)#正确的算术表达式: (3* 5)+(9 *1)#正确的算术表达式: (5* 3)+(1 *9)#正确的算术表达式: (5* 3)+(9 *1)#正确的算术表达式: (9* 1)+(3 *5)#正确的算术表达式: (9* 1)+(5 *3)#正确的算术表达式: (3* 5)+(9 /1)#正确的算术表达式: (5* 3)+(9 /1)#正确的算术表达式: (9/ 1)+(3 *5)#正确的算术表达式: (9/ 1)+(5 *3)#正确的算术表达式: (9+(1 * 3)*5)#正确的算术表达式: (9+(1 * 5)*3)#正确的算术表达式: (9+(3 * 1)*5)#正确的算术表达式: (9+(3 * 5)*1)#正确的算术表达式: (9+(5 * 1)*3)#正确的算术表达式: (9+(5 * 3)*1)#正确的算术表达式: (9+(3 * 5)/1)#正确的算术表达式: (9+(5 * 3)/1)#正确的算术表达式: (9+(3 / 1)*5)#正确的算术表达式: (9+(5 / 1)*3)#正确的算术表达式: (1*(3 * 5)+9)#正确的算术表达式: (1*(5 * 3)+9)#正确的算术表达式: (3*(1 * 5)+9)#正确的算术表达式: (3*(5 * 1)+9)#正确的算术表达式: (5*(1 * 3)+9)#正确的算术表达式: (5*(3 * 1)+9)#正确的算术表达式: (3*(5 / 1)+9)#正确的算术表达式: (5*(3 / 1)+9)#

我来回复

您尚未登录,请登录后再回复。点此登录或注册