首页 > 解决方案 > 递归函数 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);
    }

}

标签: c++

解决方案


要删除尾随x,您可以有条件地打印出来:

while ((x % i) == 0)
{
    std::cout << i;
    x /= i;
    if (x > 1)
        std::cout << " x ";
}

此外,您可以删除staticif 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];
    }
}

现场演示


推荐阅读