给定一个数的素数因子化迭代c ++中的所有因子而不递归

时间:2016-08-22 11:04:52

标签: c++ math recursion primes number-theory

我在地图中给出了数字p1 ^ x1 * p2 ^ x2 * ....的素数因子分解。 我需要迭代它的所有因素,素数和复合因素。 我设法使用递归编写了一个解决方案。

testng.xml

问题:

1)有没有更快的方法来产生这些因素?

2)如果可能,我可以用while循环替换递归吗?

2 个答案:

答案 0 :(得分:2)

  1. 即可。您的递归算法与除数的数量完全相同。任何渐近运行的算法都无法打印所有这些数字。

  2. 即可。可以使用std::stack以非递归方式重写任何递归算法以存储局部变量。但是,在你的情况下,这可能不会更快,并且会使代码更不易读,因此这种重写是不可取的。如有必要,我可以为您提供代码。

答案 1 :(得分:2)

没有递归,它可能看起来像:

bool increase(const std::vector<std::pair<std::size_t, std::size_t>>& v,
              std::vector<std::size_t>& it)
{
    for (std::size_t i = 0, size = it.size(); i != size; ++i) {
        const std::size_t index = size - 1 - i;
        ++it[index];
        if (it[index] > v[index].second) {
            it[index] = 0;
        } else {
            return true;
        }
    }
    return false;
}

std::size_t pow(std::size_t n, std::size_t power)
{
    std::size_t res = 1;
    for (std::size_t i = 0; i != power; ++i) {
        res *= n;
    }
    return res;
}

void do_job(const std::vector<std::pair<std::size_t, std::size_t>>& v,
            std::vector<std::size_t> it)
{
    std::size_t res = 1;
    for (std::size_t i = 0; i != v.size(); ++i) {
        res *= pow(v[i].first, it[i]);         
    }
    std::cout << res << std::endl; 
}

void iterate(const std::vector<std::pair<std::size_t, std::size_t>>& v)
{
    std::vector<std::size_t> it(v.size(), 0);

    do {
        do_job(v, it);
    } while (increase(v, it));
}

Demo

基本上,我们从<{1}}计算{0, 0, 0, 0}