user-0 提问: 怎么让这个程序正确的输出运算24的公式

回复:
user: user-1
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 11 楼 u012006886 的回复:] 说赵老师，赵老师就到了 可惜7楼把本人的ID敲错了（或者记错了）。 [/quote] soooooooorry! 记忆错误，特此更正，决不再错。

user: user-2
content: http://bbs.csdn.net/topics/380157851

user: user-0
content: 也就是说加进一个控制 只有这个控制被触发时才会显示运算公式。

user: user-0
content: 各位大哥 请我我那个代码要怎么样才能让在执行除法时，只要可以整除的数才可以进行相除，还有就是 怎么样才能让生成随机数的那块和运算公式的那块分开来？

user: user-3
content: 主要修改: 1 要区分参加运算的是原始字符还是中间结果,前者要转化为数值,而后者不必转化.因此把原来的calc_sign拆出一个新函数convert 2 补关于j的循环  #include <stdio.h>  #include <stdlib.h> #include <time.h> #include <ctype.h> #define MAX 13  int convert(char a) //改 {   int b;   if(a=='O')     b = 10;   else if(a=='J' )     b =11;   else if(a=='Q')     b =12;   else if(a=='K' )     b =13;   else b = (int)a - '0';    return b; }  int calc_sign(int a1, int a2, int b) //改 {   switch (b) {     /*开关控制语句     根据变量b的不同值。     执行相对应的case语句~     */   default:   case 0: return (a1+a2);    case 1: return (a1-a2);    case 2: return (a1*a2);    case 3: if (a2!=0&&(a1/a2)!=0)/* return*/ (a1/a2);           else return 0;    }  }/*运算模块*/  void calc_24point() {   int c = 0;   int a = 0;   char b[4][13]={   {'1','2','3','4','5','6','7','8','9','O','J','Q','K'},  /*扑克牌，10用O来表示*/   {'1','2','3','4','5','6','7','8','9','O','J','Q','K'},   {'1','2','3','4','5','6','7','8','9','O','J','Q','K'},   {'1','2','3','4','5','6','7','8','9','O','J','Q','K'}};   char num[4];   char sign[5]="+-*/";   int i=0;   int j=0;   int k=0;   int l=0;   int n=0;   int m=0;   int r=0;   int tem1=0;   int tem2=0;   int tem3=0;   srand( (unsigned)time(0));/*随机数发生器的初始化函数*/   a = rand()%MAX;/*产生的随机数num[0]作为增量，范围1-10*/   c =rand()%4;   num[0] =b[c][a];    a = rand()%MAX;   c = rand()%4;   num[1] =b[c][a];    a = rand()%MAX;   c = rand()%4;   num[2] = b[c][a];    c = rand()%4;   a = rand()%MAX;   num[3] = b[c][a];    printf("%c,%c,%c,%c\n",num[0],num[1],num[2],num[3]);    for(i = 0;i<4 ;i++)   {     for (j=0; j<4; j++) //加     { //加       if (j==i)continue;       for(k=0;k<4;k++)       {         if(k==i||k==j)continue;/*返回循环起始处*/         for(l = 0; l<4; l++)         {           if(l==i||l==j||l==k)continue; //改 if(l==k||l==j||l==k)continue;           for(n = 0;n<4; n++)           {              for(m = 0;m<4; m++)             {               for(r = 0;r<4; r++)               {                  tem1=calc_sign(convert(num[i]), convert(num[j]), n); //改 tem1=calc_sign(num[i],num[j],n);                 tem2=calc_sign(tem1, convert(num[k]), m); //改 tem2=calc_sign(tem1,num[k],m);                 tem3=calc_sign(tem2, convert(num[l]), r); //改 tem3=calc_sign(tem2,num[l],r);                 if(tem3==24)                 {                   printf("(%c%c%c)%c%c}%c%c=24\n",num[i],sign[n],num[j],sign[m],num[k],sign[r],num[l]);                 }                 else if(tem3==-24)                 {                   printf("%c%c(%c%c%c)}%c%c=24\n",num[k],sign[m],num[i],sign[n],num[j],sign[r],num[l]);                 }                 else                 {                   tem1=calc_sign(convert(num[i]), convert(num[j]), n); //改 tem1=calc_sign(num[i],num[j],n);                   tem2=calc_sign(convert(num[k]), convert(num[l]), r); //改 tem2=calc_sign(num[k],num[l],r);                   tem3=calc_sign(tem1,tem2,m);                   if(tem3==24.0)                   {                     printf("(%c%c%c)%c(%c%c%c)=24\n",num[i],sign[n],num[j],sign[m],num[k],sign[r],num[l]);                   }                 }               }             }           }         }       }     } //加   } }   int main() {   while(1)   {     calc_24point();     if(getchar() != 'e') continue;     else break;   } }

user: user-4
content: 你这个代码完全看不懂，没注释

user: user-1
content: 你应该从排列组合的观点出发考虑这个题目 1.给定的四个数的排列位置有哪些 2.四个数之间的运算符有哪些 3.考虑可用括号改变的运算次序有哪些  写出它们的排列  在本坛的搜索关键字是：zhao1zhong4     ，   24点

user: user-2
content: 引用 11 楼 u012006886 的回复:说赵老师，赵老师就到了 可惜7楼把本人的ID敲错了（或者记错了）。

user: user-0
content: 感谢各位大哥的帮忙， 小弟还有一个问题 怎么样才能让它输出a1/a2是整数 而不是浮点数

user: user-5
content: 说赵老师，赵老师就到了

user: user-0
content: 各位大哥，怎么才能让这个程序只输出运算结果等于24的公式啊！

user: user-0
content: 规则就是 我只要它输出运算结果等于24的公式，但是参与运算的4个数字是我上面那个程序随机生成的1到k这13个字符，其中10=O,11=J,12=Q,13=K。

user: user-0
content: 我这个程序会输出随机生成数运算公式，但是这些运算公式有一些的运算结果根本不等于24，所以我想的是怎么样才能让它输出随机生成数运算结果等于24的公式，意思就是说怎么让这个程序正确的输出运算结果等于24的公式

user: user-6
content: 说清楚点，要做什么，什么规则

user: user-0
content: 大哥 你这个代码我测试了 不行，没法正确的输出运算结果等于24的公式虽然有点是正确的有的是错误的 但我要的是正确输出运算结果等于24的公式

user: user-7
content: #include <stdio.h>  #include <stdlib.h> #include <time.h> #include <ctype.h> #define MAX 13 int calc_sign(char a1, char a2, int b) {         if(a1=='O')          a1 = 10;        else if(a1=='J' )          a1 =11;        else if(a1=='Q')          a1 =12;        else if(a1=='K' )          a1 =13;       else a1 = (int)a1;         if(a2=='O')          a2 = 10;        else if(a2=='J' )          a2 =11;        else if(a2=='Q')          a2 =12;        else if(a2=='K' )         a2 =13;       else a2 = (int)a2;      switch (b) {     /*开关控制语句       根据变量b的不同值。       执行相对应的case语句~     */         default:         case 0: return (a1+a2);          case 1: return (a1-a2);          case 2: return (a1*a2);          case 3: if (a2!=0&&(a1/a2)!=0)/* return*/ (a1/a2);         else return 0;      }  }/*运算模块*/ void calc_24point() {   int c = 0;     int a = 0;     char b[4][13]={                     {'1','2','3','4','5','6','7','8','9','O','J','Q','K'},  /*扑克牌，10用O来表示*/                     {'1','2','3','4','5','6','7','8','9','O','J','Q','K'},                     {'1','2','3','4','5','6','7','8','9','O','J','Q','K'},                     {'1','2','3','4','5','6','7','8','9','O','J','Q','K'}};     char num[4];     char sign[5]="+-*/";     int i=0;     int j=0;     int k=0;     int l=0;     int n=0;     int m=0;     int r=0;     int tem1=0;     int tem2=0;     int tem3=0;     srand( (unsigned)time(0));/*随机数发生器的初始化函数*/     a = rand()%MAX;/*产生的随机数num[0]作为增量，范围1-10*/     c =rand()%4;     num[0] =b[c][a];      a = rand()%MAX;     c = rand()%4;     num[1] =b[c][a];      a = rand()%MAX;     c = rand()%4;     num[2] = b[c][a];      c = rand()%4;     a = rand()%MAX;     num[3] = b[c][a];      printf("%c,%c,%c,%c\n",num[0],num[1],num[2],num[3]);          for(i = 0;i<4 ;i++)         {             if (j==i)continue;                  for(k=0;k<4;k++)                  {                     if(k==i||k==j)continue;/*返回循环起始处*/                     for(l = 0; l<4; l++)                     {                         if(l==k||l==j||l==k)continue;                         for(n = 0;n<4; n++)                         {                             for(m = 0;m<4; m++)                            {                                 for(r = 0;r<4; r++)                                 {                                      tem1=calc_sign(num[i],num[j],n);                                     tem2=calc_sign(tem1,num[k],m);                                     tem3=calc_sign(tem2,num[l],r);                                     if(tem3==24)                                     {                                         printf("(%c%c%c)%c%c}%c%c=24\n",num[i],sign[n],num[j],sign[m],num[k],sign[r],num[l]);                                     }                                     else if(tem3==-24)                                     {                                         printf("%c%c(%c%c%c)}%c%c=24\n",num[k],sign[m],num[i],sign[n],num[j],sign[r],num[l]);                                     }                                     else                                     {                                         tem1=calc_sign(num[i],num[j],n);                                         tem2=calc_sign(num[k],num[l],r);                                         tem3=calc_sign(tem1,tem2,m);                                         if(tem3==24.0)                                         {                                             printf("(%c%c%c)%c(%c%c%c)=24\n",num[i],sign[n],num[j],sign[m],num[k],sign[r],num[l]);                                         }                                     }                                 }                            }                         }                      }                    }          }   }   int main() {     while(1)     {         calc_24point();         if(getchar() != 'e') continue;         else break;     } }