正文

排列的生成算法之一:字典序法2006-07-30 02:13:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/petibo/16978.html

分享到:

 排列的生成算法之一:字典序法发信站: BBS 水木清华站 (Fri Apr 27 16:39:27 2001)有这么一道数学题:  *       *     * ---- + ---- + ---- =1  **     **     ** *为1~9的数字,每个数字必须用且只能用一次。分母为两位数。 可以用排列的生成算法枚举所有的情况(当然,还有其他方法,但最好要优化)double a[10];int i=345126789,ii;//1,2显然不能是分子,设a[1],a[2],a[3]为分子且a[1]<a[2]<a[3]while(i<=789654321) {  ii=i;  for(int j=9;j>0;j--)  {   a[j]=ii%10;   ii=ii/10;  }  if(a[1]<a[2]&&a[2]<a[3])  {   if(fabs((a[1]/(a[4]*10+a[5])+a[2]/(a[6]*10+a[7])+a[3]/(a[8]*10+a[9]))-1)<           1e-6)   cout<<a[1]<<"/"<<(a[4]*10+a[5])<<"+"    <<a[2]<<"/"<<(a[6]*10+a[7])<<"+"    <<a[3]<<"/"<<(a[8]*10+a[9])<<"=1"    <<endl;  }  //字典序法:找第一逆序位;找右边大于它中最小的一个交换;其余反序  for(int k=8;k>0;k--)  {   if(a[k+1]>a[k]) break;   else continue;  }  for(int kk=9;kk>k;kk--)  {   if(a[kk]<a[k]) continue;   else break;  }  int tmp=a[k];  a[k]=a[kk];  a[kk]=tmp;  i=0;  for(int l=1;l<=k;l++) i=i*10+a[l];  for(l=9;l>k;l--) i=i*10+a[l]; }

阅读(1822) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册