有这么一道数学题:
* * *
---- + ---- + ---- =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];
}
* * *
---- + ---- + ---- =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];
}