c++ - 递归函数 C++ 的逆输出
问题描述
我编写了一个函数,输出用户输入的数字的素数。我得到的输出是正确的,但是输出是向后的。
例如输入是 1776:输出 => 2 x 2 x 2 x 2 x 3 x 37 x
我正在寻找的输出是 => 37 x 3 x 2 x 2 x 2 x 2
如何反转输出并删除 37 后面的额外乘法符号 (x)。
void primefactor(int x)
{
// initalize a int with a static value of 2
static int i=2;
// if i less then or equal to x
if(i<=x)
{
// while x%i doess equal 0 you have found a factor print factor
while(x%i ==0)
{
cout<<i<<" x ";
// x takes a new value of x / i
x=x/i;
}
// increment i and call fuction again
i++;
primefactor(x);
}
}
解决方案
要删除尾随x
,您可以有条件地打印出来:
while ((x % i) == 0)
{
std::cout << i;
x /= i;
if (x > 1)
std::cout << " x ";
}
此外,您可以删除static
if you makei
成为输入参数:
void primefactor(int x, int i = 2)
{
...
primefactor(x, ++i);
...
}
但是,对于这种递归来说,反转输出有点棘手。如果您可以使用迭代循环而不是递归循环,那么您可以使用局部std::vector
来累积因子,然后在打印它们之前反转它们的顺序,例如:
#include <vector>
#include <algorithm>
void primefactor(int x)
{
std::vector<int> v;
int i = 2;
while (i <= x)
{
while ((x % i) == 0)
{
v.push_back(i);
x /= i;
}
++i;
}
if (!v.empty())
{
std::reverse(v.begin(), v.end());
std::cout << v[0];
for(size_t idx = 1; idx < v.size(); ++idx)
std::cout << " x " << v[idx];
}
}
但是,如果您绝对需要递归函数,您仍然可以使用 a std::vector
,只需将其传递给每次迭代,例如:
void primefactor_loop(int x, int i, std::vector<int> &v)
{
if (i <= x)
{
while ((x % i) == 0)
{
v.push_back(i);
x /= i;
}
primefactor_loop(x, ++i, v);
}
}
void primefactor(int x)
{
std::vector<int> v;
primefactor_loop(x, 2, v);
if (!v.empty())
{
std::reverse(v.begin(), v.end());
std::cout << v[0];
for(size_t idx = 1; idx < v.size(); ++idx)
std::cout << " x " << v[idx];
}
}
推荐阅读
- node.js - 如何使用 nodejs 获取 kubernetes pod 指标
- node.js - 如何使用nodejs删除重复的csv文件行
- python - 如何在主机上存储容器修改
- flutter - 如何通过 Dart 中的 onTap 函数将值传递到另一个屏幕?
- angular - Angular *ngIf 不能与 ng-template 一起使用
- reactjs - react.js 错误**在现有状态转换期间无法更新**
- javascript - 使用 javascript 从本地存储中删除匹配的密钥对象
- php - WPBakery Page Builder 扩展交互式文本
- html - 在背景图像上移动表格时遇到问题
- opencv - 磨损碎片图像处理