// 这是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=1098742+356=1098352+746=1098752+346=1098432+657=1089632+457=1089452+637=1089652+437=1089423+675=1098623+475=1098473+625=1098673+425=1098743+859=1602843+759=1602753+849=1602853+749=1602473+589=1062573+489=1062483+579=1062583+479=1062324+765=1089724+365=1089364+725=1089764+325=1089624+879=1503824+679=1503264+789=1053764+289=1053674+829=1503874+629=1503284+769=1053784+269=1053425+673=1098625+473=1098475+623=1098675+423=1098325+764=1089725+364=1089365+724=1089765+324=1089346+752=1098746+352=1098356+742=1098756+342=1098426+879=1305826+479=1305246+789=1035746+289=1035476+829=1305876+429=1305286+749=1035786+249=1035437+652=1089637+452=1089457+632=1089657+432=1089437+589=1026537+489=1026347+859=1206847+359=1206357+849=1206857+349=1206487+539=1026587+439=1026

评论