正文

残缺数问题2007-05-03 19:33:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/25513.html

分享到:

// 这是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

 

阅读(2491) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册