我在地图中给出了数字p1 ^ x1 * p2 ^ x2 * ....的素数因子分解。 我需要迭代它的所有因素,素数和复合因素。 我设法使用递归编写了一个解决方案。
testng.xml
问题:
1)有没有更快的方法来产生这些因素?
2)如果可能,我可以用while循环替换递归吗?
答案 0 :(得分: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));
}
基本上,我们从<{1}}计算到{0, 0, 0, 0}
。