数学题求解

有这么一道数学题:
  *       *     *
 ---- + ---- + ---- =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];
 }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值