回 帖 发 新 帖 刷新版面

主题:[讨论]请大家看看这个24点的程序,怎样才能去除重复的解

#include<stdio.h>
double fun(double a1,double a2,int b)
{switch(b)
  {case 0:return (a1+a2);
   case 1:return (a1-a2);
   case 2:return (a1*a2);
   case 3:return (a1/a2);
  }
}
void main()
{int i,j,k,l,n,m,r,save[4];
 double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;
 char sign[5]="+-*/";
 printf("input 4 numbers:");
 for(i=0;i<4;i++)
 {scanf("%lf",num+i); save[i]=num[i];}
  for(i=0;i<4;i++)
 for(j=0;j<4;j++)
 if(j!=i)
 {for(k=0;k<4;k++)
  if(k!=i&&k!=j)
  {for(l=0;l<4;l++)
   if(l!=i&&l!=j&&l!=k)
    {for(n=0;n<4;n++)
     for(m=0;m<4;m++)
     for(r=0;r<4;r++)
     {tem1=fun(num[i],num[j],n);
      tem2=fun(tem1,num[k],m);
      tem3=fun(tem2,num[l],r);
      if(tem3==24.0)printf("{(%d%c%d)%c%d}%c%d=24\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
      else if(tem3==-24.0)printf("{%d%c(%d%c%d)}%c%d=24\n",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);
      else if(tem3==1.0/24.0)printf("%d%c{(%d%c%d)%c%d}=24\n",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);
      else if(tem3==-1.0/24.0)printf("%d%c{%d%c(%d%c%d)}=24\n",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]);
      else  
        {tem1=fun(num[i],num[j],n);
   tem2=fun(num[k],num[l],r);
         tem3=fun(tem1,tem2,m);
         if(tem3==24.0) printf("(%d%c%d)%c(%d%c%d)=24\n",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
        }
  }
    }
   }
 }
}

回复列表 (共1个回复)

沙发


搜到这里的,最近我也在编24点C++源程序,这个程序居然跟我程序的思路几乎一样,
呵呵。这个程序:
1.没有考滤分母为0的问题;
2.小数、分数计算产生的误差会使结果不等于24的,这要考虑的;
3.其它几乎一样。我这就放心了,说明我的程序是成功的。

我来回复

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