【问题标题】:Finding all pairs of numbers that equals an equation找到等于等式的所有数字对
【发布时间】:2014-07-14 22:32:05
【问题描述】:

在 C++ 中发现所有符合公式的正整数对的最佳方法是什么。例如:

a^2 * b = 16;//a & b MUST be positive INT.

我怎样才能找到符合公式的所有 a 和 b 组合?

编辑:为了更清楚,这只是一个例子。真的,我有 a^2 * b = c,其中 c 使用 for 循环递增,我需要找到符合该等式标准的每个正整数对 (a,b)。

【问题讨论】:

  • 求解a并放入任意bs。
  • 这个问题应该在数学网站上。
  • (a^2)*b = 16(我理解的)还是a^(2*b) = 16
  • 只有整数解吗?否则有无限解!
  • 只有正整数解决方案,我有一个更大的问题,但这是我可以在这里问的最简单的形式。从技术上讲,我有 a^2 * b = c 其中 c 通过 for 循环递增,我需要为每个 c 找到 a 和 b 的所有可能性

标签: c++ algorithm math


【解决方案1】:

问题是找到满足方程a^2 * b = c 的所有正整数对(a,b),其中c 也是一个正整数。

根据等式,c 可以被完美平方整除。所以首先,我们找到所有将c 均分的完美正方形。很简单,a=1, b=c 满足这一点,所以我们知道c 的每个值至少有一个解。在找到每个a 之后,我们将c 除以每个a^2 以产生其对应的b

这是上面用 C++ 实现的:

std::vector<std::pair<int, int> > solve(int c) {
    std::vector<int> a;
    for (int i = 1; i * i <= c; ++i)
        if (c % (i*i) == 0) a.push_back(i);

    std::vector<std::pair<int, int> > solutions;
    solutions.reserve(a.size());
    for (std::vector<int>::iterator it = a.begin(); it != a.end(); ++it) {
        const int& a = *it;
        solutions.push_back(std::pair<int, int>(a, c / (a*a)));
    }

    return solutions;
}

这是live example,显示c = 7! = 5040 的解决方案。

【讨论】:

    【解决方案2】:

    找到c的因数,然后找到使用三个值的子集,其中两个相同。

    【讨论】:

      【解决方案3】:

      经检查,三个整数解为:

      1. a = ±1,b = 16

      2. a = ±2,b = 4

      3. a = ±4,b = 1

      否则,有无限的解决方案。 Wolfram|阿尔法gives the details.

      【讨论】:

      • 我并不是特指这个。这只是一个例子。我的意思不是在任何有两个未知变量的情况下
      • 现在您已更改评论中的问题。我没有对此进行测试,但我认为它会起作用。对于任何给定的 c,设置 a = floor(sqrt(c)) 和 b = 1。计算 a**2 * b。如果它大于 c,则将 a 减 1,然后重试。如果它小于 c,则将 b 增加 1 并重试。如果它等于c,你有一个解决方案;报告它,然后将 a 减 1 并将 b 增加 1 并重试。当 a 变为 0 时停止。
      【解决方案4】:

      如果您需要重复执行此操作,这是我认为解决此问题的最有效方法: 1. 设置一个方桌,[0, 1, 4, 9, 16, ......],桌子的长度取决于你要处理的最大数量,反正你需要O( sqrt(N)) 查找表的空间。 2. 将数分解为因数,例如16有5个因数(1、2、4、8、16)。 3.通过查表,可以发现1、4、16在查表中。所以有 6 对,命名为 (-1 or 1)^2 * 16, (-2 or 2)^2 * 4, and (-4 or 4)^2 * 1。

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多