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