www.pudn.com > 24dian.zip > 24.CPP


// Fantastic FIRE of Tiny Bug Studio 郁明 
//联络:F_FIRE@990.net  bp:52330*750999 
                               
#include  
#include                  //system(),exit() 
#include                   // clrscr() 
 
#define DA 24 
float op(float,float,float);   //运算 
int pai[4];		       //四张牌pai[1]--pai[4] 
void suanfa(int pai[]);        //主算法(穷举) 
char *fh(int t);	       //显示符号 
 
void main(void) 
{ 
clrscr();		       //清屏 
printf ("\t\t傻瓜法算%d点 (穷举计算)      \n>=|> Fantastic FIRE 异火制作  F_FIRE@990.net <|=<\n",DA); 
do {printf ("\n请输入第一张牌:");if(scanf("%d",&pai[1])==0) exit(1);}while(pai[1]==0);    //不允许输入0 
do {printf ("\n请输入第二张牌:");if(scanf("%d",&pai[2])==0) exit(1);}while(pai[2]==0); 
do {printf ("\n请输入第三张牌:");if(scanf("%d",&pai[3])==0) exit(1);}while(pai[3]==0); 
do {printf ("\n请输入第四张牌:");if(scanf("%d",&pai[4])==0) exit(1);}while(pai[4]==0); 
suanfa(pai); 
clrscr(); 
system ("type 24.log|more");    //分页显示24.log结果文件 
} 
 
char *fh(int t) 
{ 
 switch (t){ 
 case 4:return " 加 " ;break; 
 case 2:return " 减 " ;break; 
 case 3:return " 乘 " ;break; 
 case 1:return "除以" ;break; 
 default:{ printf("Bug!\n"); exit(1);}     //内部测试使用 
}} 
 
int op(int x,int y,int n) 
{ 
  switch (n) { 
  case 4: return x+y;break; 
  case 2: return x-y;break; 
  case 3: return x*y;break; 
  case 1: if(y==0){return 0.1;break;}else return x/y;break; //过滤掉 y=0 时候的计算 
  default:{ printf("Bug!\n"); exit(1);} 
}} 
 
 
void suanfa(int pai[]) 
{ 
FILE *out;   // 24.log 
out=fopen("24.log","w+"); 
fprintf (out,"\n您输入的四张牌是:%d %d %d %d\n答案如下:\n\n",pai[1],pai[2],pai[3],pai[4]); 
register int jsq=0;   //计数器 
register int i,j,k, l,m,n,o;  //3个符号,4张牌 
for (i=4;i>=1;i--) 
for (j=4;j>=1;j--) 
for (k=4;k>=1;k--) 
for (l=4;l>=1;l--)      // 穷举 
for (m=4;m>=1;m--) 
for (n=4;n>=1;n--) 
for (o=4;o>=1;o--) 
 { if((l!=m)&&(l!=n)&&(l!=o)&&(m!=n)&&(m!=o)&&(n!=o)&& 
	op( 
	   op( 
	      op(pai[l],pai[m],i) 
				 ,pai[n],j) 
					   ,pai[o],k)==24) 
    { 
    printf (">"); 
    fprintf (out,"[(%d%s",pai[l],fh(i)); 
    fprintf (out,"%d)%s",pai[m],fh(j)); 
    fprintf (out,"%d)%s",pai[n],fh(k)); 
    fprintf (out,"%d]  等于%d",pai[o],DA); 
    fprintf (out,"\n\n");jsq++; 
    } 
    else if((l!=m)&&(l!=n)&&(l!=o)&&(m!=n)&&(m!=o)&&(n!=o)&& 
	     op(pai[l], 
		       op(pai[m], 
				 op(pai[n],pai[o],i) 
						    ,j) 
						       ,k)==DA)  //过滤1 
    { 
    printf (">"); 
    fprintf (out,"%d%s",pai[l],fh(k)); 
    fprintf (out,"[%d%s",pai[m],fh(j)); 
    fprintf (out,"(%d%s",pai[n],fh(i)); 
    fprintf (out,"%d)]  等于%d",pai[o],DA);fprintf (out,"\n\n");jsq++; 
    } 
    else 
    {register int q,r,k; 
     q=op(pai[n],pai[o],j); 
     r=op(pai[l],pai[m],i); 
    if((l!=m)&&(l!=n)&&(l!=o)&&(m!=n)&&(m!=o)&&(n!=o)&&op(q,r,k)==DA) //第二种情况过滤 
      { 
       printf (">"); 
       fprintf (out,"(%d%s",pai[n],fh(j)); 
       fprintf (out,"%d)%s",pai[o],fh(k)); 
       fprintf (out,"(%d%s",pai[l],fh(i)); 
       fprintf (out,"%d)  等于%d",pai[m],DA);fprintf (out,"\n\n");jsq++; 
      } 
   } 
 } 
fprintf (out,"您要的正确答案总共有 %d 种",jsq); 
fclose(out); 
}