// 这是QQ群里某网友提出的问题,贴出我的代码,我想应该找完了
/* 用 0,1,2,3,4,5,6,7,8,9 填写 [][][]+[][][]=[][][][] 使对应的加法正确。
** 首先可以确定 1 的位置[1][][][]因为每个数字只能用一次,所以每两个数字
** 相加如果所得结果模 10 后的数字或者加 1(有进位时)后的数字已经使用过
** 则这两个数不不能填在两个加数相同的位置上。
** 例如:2+3=5,如果取 2,3 时数字 5 没有使用则可以考虑将2 3 5这三个数填
** 入([][][2]+[][][3]=[1][][][5]) 代码如下:(主要用了递归的思想)
*/
#include <stdio.h>
#include <string.h>
struct stack{
int a;
int b;
int c;
int j;
};
struct stack stk[4] = { 0 };
int digit[] = { 0,1,2,3,4,5,6,7,8,9 };
void get(int d,int *status){
int i,j,sum = 0,saveSum = 0;
if(d == 3){
if(stk[3].j == 1){
printf( "%d%d%d+%d%d%d=1%d%d%d\n" ,
stk[2].a,stk[1].a,stk[0].a,
stk[2].b,stk[1].b,stk[0].b,
stk[2].c,stk[1].c,stk[0].c );
}
return;
}
for(sum = 0,i = 2; i < 9; i++){
if(status[i] != -1){
sum += status[i];
status[i] = -1;
stk[d].a = i;
for(j = 2; j < 10; j++){
if(status[j] != -1){
saveSum = sum;
sum += status[j];
status[j] = -1;
stk[d].b = j;
if(status[(sum+stk[d].j)%10] != -1){
stk[d].c = (sum+stk[d].j)%10;
stk[d+1].j = (sum+stk[d].j) / 10;
status[(sum+stk[d].j)%10] = -1;
get(d+1,status);
status[(sum+stk[d].j)%10] = (sum+stk[d].j)%10;
}
sum = saveSum;
status[j] = j;
}
}
status[i] = i;
sum = 0;
}
}
}
int main(){
digit[1] = -1; /* 1 的位置已经确定 */
get(0,digit); /* 递归填写加数,从个位开始 */
return 0;
}
// 运行结果
342+756=1098
742+356=1098
352+746=1098
752+346=1098
432+657=1089
632+457=1089
452+637=1089
652+437=1089
423+675=1098
623+475=1098
473+625=1098
673+425=1098
743+859=1602
843+759=1602
753+849=1602
853+749=1602
473+589=1062
573+489=1062
483+579=1062
583+479=1062
324+765=1089
724+365=1089
364+725=1089
764+325=1089
624+879=1503
824+679=1503
264+789=1053
764+289=1053
674+829=1503
874+629=1503
284+769=1053
784+269=1053
425+673=1098
625+473=1098
475+623=1098
675+423=1098
325+764=1089
725+364=1089
365+724=1089
765+324=1089
346+752=1098
746+352=1098
356+742=1098
756+342=1098
426+879=1305
826+479=1305
246+789=1035
746+289=1035
476+829=1305
876+429=1305
286+749=1035
786+249=1035
437+652=1089
637+452=1089
457+632=1089
657+432=1089
437+589=1026
537+489=1026
347+859=1206
847+359=1206
357+849=1206
857+349=1206
487+539=1026
587+439=1026
评论