没事干写了。一个算24点的小程序

  1 //最终版
  2 #include <iostream>
  3 #include <cmath>
  4 using namespace std;
  5 double ans2(char* c)
  6 {
  7     double a,b;
  8     double sum;
  9     char t;
 10     a=c[2]-48;b=c[4]-48;
 11     t=c[3];
 12 //    cout<<"a: "<<a<<"b: "<<b<<"t: "<<t<<endl;
 13     if(t=='+')
 14        {sum=a+b;}
 15     if(t=='-')
 16         {sum=a-b;}
 17     if(t=='*')
 18         {sum=a*b;}
 19     if(t=='/')
 20         {sum=a/b;}
 21     //cout<<sum<<endl;
 22     a=sum;b=c[7]-48;
 23     t=c[6];
 24 //     cout<<"a: "<<a<<"b: "<<b<<"t: "<<t<<endl;
 25     if(t=='+')
 26        {sum=a+b;}
 27     if(t=='-')
 28         {sum=a-b;}
 29     if(t=='*')
 30         {sum=a*b;}
 31     if(t=='/')
 32         {sum=a/b;}
 33     a=sum;b=c[10]-48;
 34     t=c[9];
 35  //    cout<<"a: "<<a<<"b: "<<b<<"t: "<<t<<endl;
 36     if(t=='+')
 37        {sum=a+b;}
 38     if(t=='-')
 39         {sum=a-b;}
 40     if(t=='*')
 41         {sum=a*b;}
 42     if(t=='/')
 43         {sum=a/b;}
 44     return sum;
 45 }
 46 double ans3(char* c)
 47 {
 48     char t;
 49     double a,b;
 50     double sum1=0,sum2=0,sum=0;
 51     a=c[1]-48;  b=c[3]-48; t=c[2];
 52     if(t=='+')
 53        {sum1=a+b;}
 54     if(t=='-')
 55         {sum1=a-b;}
 56     if(t=='*')
 57         {sum1=a*b;}
 58     if(t=='/')
 59         {sum1=a/b;}
 60     a=c[7]-48; b=c[9]-48; t=c[8];
 61     if(t=='+')
 62        {sum2=a+b;}
 63     if(t=='-')
 64         {sum2=a-b;}
 65     if(t=='*')
 66         {sum2=a*b;}
 67     if(t=='/')
 68         {sum2=a/b;}
 69     a=sum1; b=sum2;  t=c[5];
 70     if(t=='+')
 71        {sum=a+b;}
 72     if(t=='-')
 73         {sum=a-b;}
 74     if(t=='*')
 75         {sum=a*b;}
 76     if(t=='/')
 77         {sum=a/b;}
 78     return sum;
 79 }
 80 double ans4(char* c)
 81 {
 82     char t;
 83     double a,b;
 84     double sum1=0,sum2=0,sum=0;
 85     a=c[4]-48;  b=c[6]-48; t=c[5];
 86     if(t=='+')
 87        {sum1=a+b;}
 88     if(t=='-')
 89         {sum1=a-b;}
 90     if(t=='*')
 91         {sum1=a*b;}
 92     if(t=='/')
 93         {sum1=a/b;}
 94     a=c[1]-48; b=sum1; t=c[2];
 95     if(t=='+')
 96        {sum2=a+b;}
 97     if(t=='-')
 98         {sum2=a-b;}
 99     if(t=='*')
100         {sum2=a*b;}
101     if(t=='/')
102         {sum2=a/b;}
103     a=sum2; b=c[10]-48;  t=c[9];
104     if(t=='+')
105        {sum=a+b;}
106     if(t=='-')
107         {sum=a-b;}
108     if(t=='*')
109         {sum=a*b;}
110     if(t=='/')
111         {sum=a/b;}
112     return sum;
113 }
114 double ans5(char* c)
115 {
116     char t;
117     double a,b;
118     double sum1=0,sum2=0,sum=0;
119     a=c[4]-48;  b=c[6]-48; t=c[5];
120     if(t=='+')
121        {sum1=a+b;}
122     if(t=='-')
123         {sum1=a-b;}
124     if(t=='*')
125         {sum1=a*b;}
126     if(t=='/')
127         {sum1=a/b;}
128     a=sum1; b=c[9]-48; t=c[8];
129     if(t=='+')
130        {sum2=a+b;}
131     if(t=='-')
132         {sum2=a-b;}
133     if(t=='*')
134         {sum2=a*b;}
135     if(t=='/')
136         {sum2=a/b;}
137     a=c[0]-48; b=sum2;  t=c[1];
138     if(t=='+')
139        {sum=a+b;}
140     if(t=='-')
141         {sum=a-b;}
142     if(t=='*')
143         {sum=a*b;}
144     if(t=='/')
145         {sum=a/b;}
146     return sum;
147 }
148 double ans6(char* c)
149 {
150     char t;
151     double a,b;
152     double sum1=0,sum2=0,sum=0;
153     a=c[6]-48;  b=c[8]-48; t=c[7];
154     if(t=='+')
155        {sum1=a+b;}
156     if(t=='-')
157         {sum1=a-b;}
158     if(t=='*')
159         {sum1=a*b;}
160     if(t=='/')
161         {sum1=a/b;}
162     a=c[3]-48; b=sum1; t=c[4];
163     if(t=='+')
164        {sum2=a+b;}
165     if(t=='-')
166         {sum2=a-b;}
167     if(t=='*')
168         {sum2=a*b;}
169     if(t=='/')
170         {sum2=a/b;}
171     a=c[0]-48; b=sum2;  t=c[1];
172     if(t=='+')
173        {sum=a+b;}
174     if(t=='-')
175         {sum=a-b;}
176     if(t=='*')
177         {sum=a*b;}
178     if(t=='/')
179         {sum=a/b;}
180     return sum;
181 }
182 void fkind(char* a,int n,int i,char* t,char *p)
183 {
184     static int tot=0;
185     if(i==n)
186     {
187         for(int j=0;j<n;j++)
188            {
189               // cout<<t[j]<<" ";
190                p[tot++]=t[j];
191            }
192     //   cout<<endl;
193    //  cout<<endl<<tot++<<endl;
194     }
195     else if(i<n)
196     {
197         for(int j=0;j<4;j++)
198         {
199             t[i]=a[j];
200             fkind(a,n,i+1,t,p);
201         }
202     }
203 }
204 void nkind(int* a,int n,int i,int* t,int *p)
205 {
206     static int tot=0;
207     if(i==n)
208     {
209         for(int j=0;j<n;j++)
210            {
211             //   cout<<t[j]<<" ";
212                p[tot++]=t[j];
213            }
214     //    cout<<endl;
215     // cout<<endl<<tot++<<endl;
216     }
217     else if(i<n)
218     {
219         for(int j=0;j<4;j++)
220         {
221             if(a[j]!=-1)
222             {
223                t[i]=a[j];
224                int s=a[j];
225                a[j]=-1;
226                nkind(a,n,i+1,t,p);
227                a[j]=s;
228             }
229         }
230     }
231 }
232 void equation(int* a,char* b,char* c)
233 {
234     c[0]=c[1]='(';
235     c[5]=c[8]=')';
236     c[2]=a[0]+48;
237     c[4]=a[1]+48;
238     c[7]=a[2]+48;
239     c[10]=a[3]+48;
240     c[3]=b[0];
241     c[6]=b[1];
242     c[9]=b[2];
243     c[11]='\0';
244 }
245 void equation3(int* a,char* b,char* c)
246 {
247     c[0]=c[6]='(';
248     c[4]=c[10]=')';
249     c[1]=a[0]+48;
250     c[3]=a[1]+48;
251     c[7]=a[2]+48;
252     c[9]=a[3]+48;
253     c[2]=b[0];
254     c[5]=b[1];
255     c[8]=b[2];
256     c[11]='\0';
257 }
258 void equation4(int* a,char* b,char* c)
259 {
260     c[0]=c[3]='(';
261     c[8]=c[7]=')';
262     c[1]=a[0]+48;
263     c[4]=a[1]+48;
264     c[6]=a[2]+48;
265     c[10]=a[3]+48;
266     c[2]=b[0];
267     c[5]=b[1];
268     c[9]=b[2];
269     c[11]='\0';
270 }
271 void equation5(int* a,char* b,char* c)
272 {
273     c[2]=c[3]='(';
274     c[10]=c[7]=')';
275     c[0]=a[0]+48;
276     c[4]=a[1]+48;
277     c[6]=a[2]+48;
278     c[9]=a[3]+48;
279     c[1]=b[0];
280     c[5]=b[1];
281     c[8]=b[2];
282     c[11]='\0';
283 }
284 void equation6(int* a,char* b,char* c)
285 {
286     c[2]=c[5]='(';
287     c[10]=c[9]=')';
288     c[0]=a[0]+48;
289     c[3]=a[1]+48;
290     c[6]=a[2]+48;
291     c[8]=a[3]+48;
292     c[1]=b[0];
293     c[4]=b[1];
294     c[7]=b[2];
295     c[11]='\0';
296 }
297 void actoa2(int* a,char (*p)[5],int *sig)
298 {
299     int i=0;
300     for(i=0;i<4;i++)
301     {
302         if(sig[i]==1)
303         {
304             if(*(p+i)[0]=='1')  a[i]=1;
305             if(*(p+i)[0]=='2')  a[i]=2;
306             if(*(p+i)[0]=='3')  a[i]=3;
307             if(*(p+i)[0]=='4')  a[i]=4;
308             if(*(p+i)[0]=='5')  a[i]=5;
309             if(*(p+i)[0]=='6')  a[i]=6;
310             if(*(p+i)[0]=='7')  a[i]=7;
311             if(*(p+i)[0]=='8')  a[i]=8;
312             if(*(p+i)[0]=='9')  a[i]=9;
313         }
314         else if(sig[i]==2)
315         {
316            if(p[i][1]=='0'&&*(p+i)[0]=='1') {a[i]=10;  }
317            if(p[i][1]=='1'&&*(p+i)[0]=='1') {a[i]=11;  }
318            if(p[i][1]=='2'&&*(p+i)[0]=='1') {a[i]=12;  }
319            if(p[i][1]=='3'&&*(p+i)[0]=='1') {a[i]=13;  }
320         }
321         else if(sig[i]==0)
322         {
323             if(*(p+i)[0]=='a'||*(p+i)[0]=='A')   a[i]=1;
324             if(*(p+i)[0]=='j'||*(p+i)[0]=='J')   a[i]=11;
325             if(*(p+i)[0]=='q'||*(p+i)[0]=='Q')   a[i]=12;
326             if(*(p+i)[0]=='k'||*(p+i)[0]=='K')   a[i]=13;
327         }
328     }
329 }
330 int main()
331 {
332  //   char c[15];
333     int a[4];
334     int sig[4];
335     char ac[4][5];
336     int num[24][4];
337     int tn[4];
338     int* pn=num[0];
339     char str[64][3];
340     char cs[4]={'+','-','*','/'};
341     char tc[4];
342     char* ps=str[0];
343     fkind(cs,3,0,tc,ps);
344     cout<<"可以输入字母J,Q,K,A代替11,12,13,1:\n";
345     for(int i=0;i<4;i++)
346         {
347             cin>>ac[i];
348             if(ac[i][2]=='\0'&&(ac[i][1]=='1'||ac[i][1]=='2'||ac[i][1]=='3'||ac[i][1]=='0')&&ac[i][0]=='1')   sig[i]=2;
349             else
350             {
351                 if(ac[i][0]>='1'&&ac[i][0]<='9'&&ac[i][1]=='\0')  sig[i]=1;
352                 else sig[i]=0;
353             }
354         }
355         actoa2(a,ac,sig);
356     nkind(a,4,0,tn,pn);
357     int i,j;
358     int ok=0;
359     int tot=0;
360     for(i=0;i<24;i++)
361     {
362         for(j=0;j<64;j++)
363         {
364             tot++;
365             double x=0.0;
366             char c[15];
367             equation(num[i],str[j],c);
368             x=ans2(c);
369             if(fabs(x-24.0)<=1e-5)
370             {
371                 ok=1;
372                 for(int k=0;k<11;k++)
373                 {
374                     if(k==2||k==4||k==7||k==10)
375                     {
376                         if(c[k]==';')  c[k]='J';
377                         else if(c[k]==':') c[k]='T';
378                         else if(c[k]=='<') c[k]='Q';
379                         else if(c[k]=='=') c[k]='K';
380                         else if(c[k]=='1') c[k]='A';
381                     }
382                 }
383                 for(int k=0;k<11;k++)
384                     cout<<c[k];
385                 cout<<"=24"<<endl;
386             }
387              if(fabs(x-4.0)<=1e-5)
388             {
389                 cout<<"可用阶乘:\n";
390                 ok=2;
391                   for(int k=0;k<11;k++)
392                 {
393                 if(k==2||k==4||k==7||k==10)
394                     {
395                         if(c[k]==';')  c[k]='J';
396                         else if(c[k]==':') c[k]='T';
397                         else if(c[k]=='<') c[k]='Q';
398                         else if(c[k]=='=') c[k]='K';
399                         else if(c[k]=='1') c[k]='A';
400                     }
401                 }
402                 cout<<"(";
403                 for(int k=0;k<11;k++)
404                     cout<<c[k];
405                 cout<<")!=24"<<endl;
406             }
407             double y=0.0;
408             char d[15];
409             equation3(num[i],str[j],d);
410             y=ans3(d);
411              if(fabs(y-24.0)<=1e-5)
412             {
413                 ok=1;
414                 for(int k=0;k<11;k++)
415                 {
416                     if(k==1||k==3||k==7||k==9)
417                     {
418                         if(d[k]==';')  d[k]='J';
419                         else if(d[k]==':') d[k]='T';
420                         else if(d[k]=='<') d[k]='Q';
421                         else if(d[k]=='=') d[k]='K';
422                         else if(d[k]=='1') d[k]='A';
423                     }
424                 }
425                 for(int k=0;k<11;k++)
426                     cout<<d[k];
427                 cout<<"=24"<<endl;
428             }
429              if(fabs(y-4.0)<=1e-5)
430             {
431                 cout<<"可用阶乘:\n";
432                 ok=2;
433                   for(int k=0;k<11;k++)
434                 {
435                    for(int k=0;k<11;k++)
436                 {
437                     if(k==1||k==3||k==7||k==9)
438                     {
439                         if(d[k]==';')  d[k]='J';
440                         else if(d[k]==':') d[k]='T';
441                         else if(d[k]=='<') d[k]='Q';
442                         else if(d[k]=='=') d[k]='K';
443                         else if(d[k]=='1') d[k]='A';
444                     }
445                 }
446                 }
447                 cout<<"(";
448                 for(int k=0;k<11;k++)
449                     cout<<d[k];
450                 cout<<")!=24"<<endl;
451             }
452             double e1=0.0;
453             char e[15];
454             equation4(num[i],str[j],e);
455             e1=ans4(e);
456             if(fabs(e1-24.0)<=1e-5)
457             {
458                 ok=1;
459                 for(int k=0;k<11;k++)
460                 {
461                     if(k==1||k==4||k==6||k==10)
462                     {
463                         if(e[k]==';')  e[k]='J';
464                         else if(e[k]==':') e[k]='T';
465                         else if(e[k]=='<') e[k]='Q';
466                         else if(e[k]=='=') e[k]='K';
467                         else if(e[k]=='1') e[k]='A';
468                     }
469                 }
470                 for(int k=0;k<11;k++)
471                     cout<<e[k];
472                 cout<<"=24"<<endl;
473             }
474                if(fabs(e1-4.0)<=1e-5)
475             {
476                 cout<<"可用阶乘:\n";
477                 ok=2;
478                   for(int k=0;k<11;k++)
479                 {
480                    for(int k=0;k<11;k++)
481                 {
482                     if(k==1||k==4||k==6||k==10)
483                     {
484                         if(e[k]==';')  e[k]='J';
485                         else if(e[k]==':') e[k]='T';
486                         else if(e[k]=='<') e[k]='Q';
487                         else if(e[k]=='=') e[k]='K';
488                         else if(e[k]=='1') e[k]='A';
489                     }
490                 }
491                 }
492                 cout<<"(";
493                 for(int k=0;k<11;k++)
494                     cout<<e[k];
495                 cout<<")!=24"<<endl;
496             }
497             double f1=0.0;
498             char f[15];
499             equation5(num[i],str[j],f);
500             f1=ans5(f);
501             if(fabs(f1-24.0)<=1e-5)
502             {
503                 ok=1;
504                 for(int k=0;k<11;k++)
505                 {
506                     if(k==0||k==4||k==6||k==9)
507                     {
508                         if(f[k]==';')  f[k]='J';
509                         else if(f[k]==':') f[k]='T';
510                         else if(f[k]=='<') f[k]='Q';
511                         else if(f[k]=='=') f[k]='K';
512                         else if(f[k]=='1') f[k]='A';
513                     }
514                 }
515                 for(int k=0;k<11;k++)
516                     cout<<f[k];
517                 cout<<"=24"<<endl;
518             }
519                    if(fabs(f1-4.0)<=1e-5)
520             {
521                 cout<<"可用阶乘:\n";
522                 ok=2;
523                   for(int k=0;k<11;k++)
524                 {
525                    for(int k=0;k<11;k++)
526                 {
527                  if(k==0||k==4||k==6||k==9)
528                     {
529                         if(f[k]==';')  f[k]='J';
530                         else if(f[k]==':') f[k]='T';
531                         else if(f[k]=='<') f[k]='Q';
532                         else if(f[k]=='=') f[k]='K';
533                         else if(f[k]=='1') f[k]='A';
534                     }
535                 }
536                 }
537                 cout<<"(";
538                 for(int k=0;k<11;k++)
539                     cout<<f[k];
540                 cout<<")!=24"<<endl;
541             }
542             double g1=0.0;
543             char g[15];
544             equation6(num[i],str[j],g);
545             g1=ans6(g);
546             if(fabs(g1-24.0)<=1e-5)
547             {
548                 ok=1;
549                 for(int k=0;k<11;k++)
550                 {
551                     if(k==0||k==3||k==6||k==8)
552                     {
553                         if(g[k]==';')  g[k]='J';
554                         else if(g[k]==':') g[k]='T';
555                         else if(g[k]=='<') g[k]='Q';
556                         else if(g[k]=='=') g[k]='K';
557                         else if(g[k]=='1') g[k]='A';
558                     }
559                 }
560                 for(int k=0;k<11;k++)
561                     cout<<g[k];
562                 cout<<"=24"<<endl;
563             }
564              if(fabs(g1-4.0)<=1e-5)
565                {
566                 cout<<"可用阶乘:\n";
567                 ok=2;
568                   for(int k=0;k<11;k++)
569                 {
570                    for(int k=0;k<11;k++)
571                 {
572               if(k==0||k==3||k==6||k==8)
573                     {
574                         if(g[k]==';')  g[k]='J';
575                         else if(g[k]==':') g[k]='T';
576                         else if(g[k]=='<') g[k]='Q';
577                         else if(g[k]=='=') g[k]='K';
578                         else if(g[k]=='1') g[k]='A';
579                     }
580                 }
581                 }
582                 cout<<"(";
583                 for(int k=0;k<11;k++)
584                     cout<<g[k];
585                 cout<<")!=24"<<endl;
586             }
587         }
588         if(ok==1)
589             break;
590         if(tot==1536&&ok==0)
591             cout<<"NO ANSWER!\n";
592     }
593     char ch;
594     cout<<"按任意键结束.....";
595     cin>>ch;
596     return 0;
597 }