【问题标题】:Finding the smallest prime factor using recursion c++使用递归c ++找到最小的素数
【发布时间】:2020-07-03 01:23:35
【问题描述】:

我是 C++ 新手,我的任务是编写一个代码,该代码使用递归找到数字的最小素因子。如果 N 小于 2,则代码应返回 1。如果 N 本身是素数,则代码应返回 N。否则,代码应返回 N 的最小素数。我尝试了这个问题,但我使用了 for 循环检查最低的主要因素,我不确定在我的答案的上下文中这种方法是迭代的还是递归的。要调用 main 函数,用户应输入lowestPrimeFactor(x);,其中x 是他们想要为其找到最低素因子的数字。我坚持尝试将迭代部分更改为递归部分,其中代码检查最低的主要因素。如有任何反馈,我将不胜感激。

#include <stdio.h>
#include <iostream>
#include <math.h>
long lowestPrimeFactor(long N, long i=2) {
    if(N<2){  //if N is less than 2, return 1
        std::cout << 1; //print to screen to check
        return 1;
    }

    bool isPrime =true; //Check if number is prime
    for(i=2;i<=N/2; ++i){
        if(N%i==0){
            isPrime=false;
            break;
        }
    }
        if (isPrime){
            std::cout<<N;
            return N;
        }

        for (int i = 3; i* i <= N; i+=2){ //This is where I am unsure how to translate to recursive as it is based of an iterative solution
                if(N%i == 0)
                std::cout<<i;
                return i;
    }


//Driver code to check functionality
int main(){
lowestPrimeFactor(19);
}


编辑 我想我已经正确地修改了代码以递归进行主要因素检查

        //Recursive
        if(i*i<=N){
            N%i==0; lowestPrimeFactor(i);
        }
        else return i;

只需要尝试调整 bool 部分也可以递归

【问题讨论】:

  • '我不确定在我的答案上下文中这种方法是迭代的还是递归的。'如果这是您的问题,那么答案是迭代的。需要在lowestPrimeFactor() 内部调用lowestPrimeFactor() 才能使其递归。
  • 好的,谢谢,我试图将这个 'for' 语句更改为带有 'return i' 的 'if' 但我无法让条件起作用,你的意思是 return 语句如果是这样的话,应该调用最低的Primefactor()。
  • 我刚刚意识到我没有在代码之外指定我的问题,抱歉,您认为这是我卡住的地方是正确的。
  • 我还没有深入了解对最低PrimeFactor() 的调用应该去哪里。我只是说在某处这样的调用是递归编程的决定性质量。

标签: c++ recursion prime-factoring


【解决方案1】:

试试这个:

#include <iostream>

using namespace std;

long lowestPrimeFactor(long N, long i = 2) {
    if (N % i == 0) // Test for factor
        return i;
    else if (i < N * N)
        return lowestPrimeFactor(N, i + 1); // Test next factor
    else
        return N;
}

void test(long N){
    // Format results
    cout << N << " gives " << lowestPrimeFactor(N) << endl;
}

int main() {
    for (long N = 2; N < 30; ++N)  // Generate some test cases
        test(N);
}

这也有效率低下,它也测试非主要因素(我认为原始解决方案也是如此)所以真的而不是使用i + 1(i 之后的下一个整数)递归,我们应该计算并传入i 之后的下一个素数。

【讨论】:

  • 如果你从i=3开始,你可以跳过所有的偶数(return lowestPrimeFactor(N, i+2),那么你只需将它包装在一个函数中,检查N是否是偶数并返回2或@987654328 @取决于N的奇偶校验
  • 你也有错误,i &lt; N * N应该是i &lt; sqrt(N)
  • 是的。实际上,i * i
【解决方案2】:

如果您想使用递归来检查最低素因子而不是最后一个 for 循环,所需的代码如下:

#include <iostream>

long lowestPrimeFactor(long N,long pr = 3)
{
bool isPrime =true;
if(N<2)
{  //if N is less than 2, return 1
    std::cout << N << std::endl;//print to screen to check
    return 1;
}    
else
{
    for(long i=2;i<=N/2; ++i)
    {
        if(N%i==0)
        {
        isPrime=false;
        break;
        }
    }
}
if(isPrime)
{
    std::cout << N << std::endl;
    return N;
}
else
{
    if(N%2==0){
        std::cout << 2 << std::endl;
        return 2;
    }
    else
    {
        if(N%pr == 0)
        {
            std::cout << pr << std::endl;
            return pr;
        }
        else
        {
            return lowestPrimeFactor(N,pr+2);
        }    
    }
}
}

//Driver code to check functionality
int main()
{
lowestPrimeFactor(19);
lowestPrimeFactor(20);
lowestPrimeFactor(7);
lowestPrimeFactor(1);
lowestPrimeFactor(15);
}

这不是完全递归的,但它只检查直到 7 的素数,然后检查 9 等等,即即使是原始代码也有的奇数。 注意:它正确检查的素数:2、3、5、7 和素数

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多