给定一个数的质因数分解,在c++中不递归地遍历所有因子
given prime factorization of a number iterate through all factors in c++ without recursion
给定一个数字p1^x1 * p2^x2 * ....的质因数分解在地图上。我需要遍历它的所有因子,质数和合数。我设法用递归写了一个解决方案。
#include <iostream>
#include <map>
#include <cstdlib>
using namespace std;
struct PROBLEM {
int mx = 400;
map<int, int> mp = {{2, 2}, {3, 1}, {5, 1}, {7, 2}};
int lastPrimeFactor = 7;
int num = 1;
auto solve() {
rec(2, 0);
return 0;
}
int next_prime_factor(int p) {
return (p == 2) ? 3 : (p == 3) ? 5 : (p == 5) ? 7 : -1;
}
void rec(int prime, int power) {
if (mx == 0) {
cout << "Infinite recursionnn";
exit(0);
} else --mx;
if (prime == lastPrimeFactor && power > mp[prime]) {
return;
}
if (power < mp[prime]) {
num *= prime;
cout << num << endl;
rec(prime, power + 1);
num /= prime;
}
if (prime != lastPrimeFactor) {
rec(next_prime_factor(prime), 0);
}
}
};
int main() {
PROBLEM().solve();
return 0;
}
问题:
1)是否有更快的方法来产生这些因子?
2)如果可能的话,我可以用while循环代替递归吗?
- 没有
。你的递归算法和除数运算的时间是一样的。
任何渐进更快的算法都无法打印出所有这些数字。对。任何递归算法都可以用非递归的方式重写,使用
std::stack
来存储局部变量。但是,在您的情况下,这样做可能不会更快,而且会使代码的可读性大大降低,所以这样的重写是不可取的。如果需要,我可以提供代码给你。
如果没有递归,它可能看起来像:
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));
}
演示基本上,我们把从{0, 0, 0, 0}
算到{2, 1, 1, 2}
。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 包含模板文件的递归会导致编译失败