回 帖 发 新 帖 刷新版面

主题:数字求和

1到9这几个数字,每三个组成一个三位数,每个数字只能用一次,要求其中两个的和等于第三个的值。求出所有的符合要求的数字

#include<stdio.h>
#include<stdlib.h>

int main()
{
  int A[3] = {0};    //数字A
  int B[3] = {0};    //数字B
  int C[3] = {0};  //和
  int nSet[3] = {0};    //进位
  for (int i1 = 1; i1 <= 9; ++i1)      //查找个位
  {
    A[2] = i1;    //数字A的个位
    for (int j1 = 1; j1 <= 9; ++j1)
    {
      B[2] = j1;  //数字B的个位
      if (B[2] != A[2])    //数字不重复
      {
        C[2] = (A[2]+B[2])%10;  //结果的个位
        if (C[2] != A[2] && C[2] != B[2] && C[2] != 0)  //数字不重复
        {
          nSet[2] = (A[2]+B[2])/10;    //结果的进位
          for (int i2 = 1; i2 <= 9; ++i2)      //查找十位
          {
            A[1] = i2;    //数字A的十位
            if (A[1] != A[2] && A[1] != B[2] && A[1] != C[2])  //数字不重复
            {
              for (int j2 = 1; j2 <= 9; ++j2)
              {
                B[1] = j2;//数字B的十位
                if (B[1] != A[1] && B[1] != A[2] && B[1] != B[2] && B[1] != C[2])  //数字不重复
                {
                  C[1] = (A[1] + B[1] + nSet[2])%10;    //结果的十位
                  if (C[1] != C[2] && C[1] != A[2] && C[1] != B[2] &&
                    C[1] != A[1] && C[1] != B[1] && C[1] != 0)    //数字不重复
                  {
                    nSet[1] = (A[1] + B[1] + nSet[2])/10;      //结果的进位
                    for (int i3 = 1; i3 <= 9; ++i3)
                    {
                      A[0] = i3;      //结果的百位
                      if (A[0] != A[1] && A[0] != A[2] &&
                        A[0] != B[1] && A[0] != B[2] &&
                        A[0] != C[1] && A[0] != C[2])    //数字不重复
                      {
                        for (int j3 = 1; j3 <= 9; ++j3)
                        {
                          B[0] = j3;
                          if (B[0] != A[0] && B[0] != A[1] && B[0] != A[2] &&
                            B[0] != B[1] && B[0] != B[2] && 
                            B[0] != C[1] && B[0] != C[2])    //数字不重复
                          {
                            C[0] = (A[0] + B[0] + nSet[1])%10;    //结果的百位
                            nSet[0] = (A[0] + B[0] + nSet[1])/10;      //结果的进位
                            if (nSet[0] == 0 && C[0] != C[1] && C[0] != C[2] &&
                              C[0] != A[0] && C[0] != A[1] && C[0] != A[2] &&
                              C[0] != B[0] && C[0] != B[1] && C[0] != B[2])
                            {
                              printf("%d%d%d + %d%d%d = %d%d%d\n", A[0], A[1], A[2],
                                B[0], B[1], B[2],
                                C[0], C[1], C[2]);
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  system("pause");
  return 0;
}

回复列表 (共1个回复)

沙发

[code=c]#include <stdio.h>
#include <stdlib.h>

int used[10] = {0}; // 表示目前i是否用过。如果数字5已经用过,则used[5]等于1,否则used[5]等于0
int buf[6]; // 六个数字,依次表示第一个数的个、十、百位,和第二个数的个、十、百位
int total = 0; // 所有解的个数

void f(int position) {
    int i;
    if (position == 6) {
        // 计算第一、第二个数字之和
        int sum = buf[0] + buf[1] * 10 + buf[2] * 100 + buf[3] + buf[4] * 10 + buf[5] * 100;
        if (sum < 1000) {
            // 分离出个、十、百位
            int a = sum % 10;
            int b = sum / 10 % 10;
            int c = sum / 100;
            if (a != b && a != c && b != c
             && a != 0 && !used[a]
             && b != 0 && !used[b]
             && c != 0 && !used[c]) {
                printf("%d%d%d + %d%d%d = %d\n", buf[2], buf[1], buf[0], buf[5], buf[4], buf[3], sum);
                ++total;
            }
        }

        return;
    }

    for (i = 1; i < 10; ++i) {
        if (!used[i]) {
            used[i] = 1;
            buf[position] = i;
            f(position + 1);
            used[i] = 0;
        }
    }
}

int main() {
    f(0);
    printf("total: %d\n", total);
    return EXIT_SUCCESS;
}[/code]

我来回复

您尚未登录,请登录后再回复。点此登录或注册