排列的生成算法之一:字典序法发信站: 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]; }

评论