// 桥本分数式回溯实现 ,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结束
}
}