根据特定约束生成3位数字

时间:2015-10-16 19:25:08

标签: c++

如果我拿3个数字A B C,每个3位数(在100-999之间)并且执行:

A + B = C

如果使用的所有九个数字都是非零并且彼此不同(1-2-3-4-5-6-7-8-9)那么C的数字之和将始终为18。

ex : 152 + 487 = 639   -----> 6+3+9 = 18 
     357 + 462 = 819 = -----> 8+1+9 = 18 

我需要我的程序来显示尊重这种关系的所有数字A,B和C的情况。我不确定如何解决这个问题。我在考虑使用外部for循环和内部for循环或使用rand函数,但我不确定如何为这些方法中的任何一个提供必要的条件。

3 个答案:

答案 0 :(得分:1)

枚举全部9个! (= 362880)9位数的排列,然后对每个排列检查它是否符合要求。

1 2 3 4 5 6 7 8 9    one permutation
----- ----- -----
  A     B     C      chunked to these numbers (simple base10 math)

要生成排列,您可以使用next_permutation

答案 1 :(得分:0)

  1. 查找所有位数为18的3位数字对。
  2. 添加数字;如果总和不等于999,则丢弃。
  3. 丢弃A1 == B2和A2 == B1
  4. 的条目

    优化:

    • 每个号码A只有一个唯一的号码B,A + B == 999。

    • 对于每个数字A和B,当前A和下一个A与当前B之间的差异和下一个B总是大于8.

    使用条件满足所需的数学条件。就这么简单。

    使用for循环迭代所有3位数字对或使用async

    并行化

    我在手机上,所以我无法编码;如果你需要更多,我会编辑它。

答案 2 :(得分:0)

我的方法是通过" 123456789"的所有排列。使用std::next_permutation并检查前3位数加上后3位数减去最后3位数等于0.类似于:

int main() 
{
    std::string numbers = "123456789";
    int a, b, c;
    do
    {
        a = std::stoi(numbers.substr(0, 3));
        b = std::stoi(numbers.substr(3, 3));
        c = std::stoi(numbers.substr(6, 3));
        if (a + b == c)
            std::cout << a << " + " << b << " = " << c << "\n";
    } while (std::next_permutation(numbers.begin(), numbers.end()));
}