找到等于等式的所有数字对

时间:2014-07-14 22:32:06

标签: c++ algorithm math

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

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

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

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

4 个答案:

答案 0 :(得分:5)

问题是找到满足等式(a,b)的所有正整数对a^2 * b = c,其中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的解决方案。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

通过检查,三个整数解决方案是:

  1. a =±1,b = 16

  2. a =±2,b = 4

  3. a =±4,b = 1

  4. 否则,有无限的解决方案。 Wolfram | Alpha gives the details

答案 3 :(得分:0)

如果您需要反复执行此操作,我认为这是解决此问题的最有效方法: 1.设置一个方形表,[0,1,4,9,16 ......],表的长度取决于你要处理的最大数量,无论如何,你需要O( sqrt(N))查找表的空间。 2.将数字除以因子,例如,16有5个因子(1,2,4,8,16)。 3.从查看查找表,您可以在查找表中找到1,4和16。所以有6对,命名,( - 1或1)^ 2 * 16,( - 2或2)^ 2 * 4,和( - 4或4)^ 2 * 1.