桥本分数式

// 桥本分数式回溯实现 ,c521 
// 把1,2,...,9填入□/□□+□/□□=□/□□  
#include <stdio.h>
void main()
{int g,i,k,s,a[10];
 long m1,m2,m3;
i=1;a[1]=1;s=0;
while (1)
   {g=1;
    for(k=i-1;k>=1;k--)
      if(a[i]==a[k]) {g=0;break;}            // 两数相同,标记g=0  
    if(i==9 && g==1 && a[1]<a[4])
     { m1=a[2]*10+a[3];
m2=a[5]*10+a[6];
m3=a[8]*10+a[9];
       if(a[1]*m2*m3+a[4]*m1*m3==a[7]*m1*m2)  // 判断等式  
         {s++;printf("(%2d) ",s);
printf("%d/%ld+%d/",a[1],m1,a[4]);
printf("%ld=%d/%ld   ",m2,a[7],m3);
if(s%2==0) printf("\n");
}
}
  if(i< 9 && g==1) 
{i++;a[i]=1;continue;}      // 不到9个数,往后继续  
  while(a[i]==9 && i>1) i--;    // 往前回溯  
  if(a[i]==9 && i==1) break;
else a[i]++;                  // 至第1个数为9结束  
  }
printf("  共以上%d个解。\n",s);
}



// 10数字分数式,c522
#include <stdio.h>
void main()
{int g,i,k,s,t,u,a[11]; long m1,m2,m3;
i=1;a[1]=0;s=0;
while (1)
   {g=1;
    for(k=i-1;k>=1;k--)
      if(a[i]==a[k]) {g=0;break;}            // 两数相同,标记g=0 
    if(i==10 && g==1 && a[3]*a[6]*a[7]*a[10]==0)
     { m1=a[2]*10+a[3];
m2=a[5]*100+a[6]*10+a[7];
          m3=a[9]*10+a[10];
       if(a[1]*m2*m3+a[4]*m1*m3==a[8]*m1*m2)  // 判断等式 
       {t=0;
        for(u=2;u<=9;u++)                    // 测试3个分数是否为真分数
         {if(a[1]%u==0 && m1%u==0) {t=1;break;}
       if(a[4]%u==0 && m2%u==0) {t=1;break;}
          if(a[8]%u==0 && m3%u==0) {t=1;break;}
         }     
            if(t==0)          
         {printf("  %d/%ld+%d/",a[1],m1,a[4]);
printf("%ld=%d/%ld\n ",m2,a[8],m3);
             }
}
}
   if(i<10 && g==1) 
{i++;a[i]=0;continue;}      // 不到10个数,往后继续
   while(a[i]==9 && i>1) i--;    // 往前回溯 
   if(a[i]==9 && i==1) break;
else a[i]++;                  // 至第1个数为9结束
  }
}

 

posted on 2017-12-07 23:57  小星_log  阅读(945)  评论(0编辑  收藏  举报