使用递归c ++找到最小的素数
Posted
技术标签:
【中文标题】使用递归c ++找到最小的素数【英文标题】:Finding the smallest prime factor using recursion 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() 的调用应该去哪里。我只是说在某处这样的调用是递归编程的决定性质量。 【参考方案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 < N * N
应该是i < 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 和素数
【讨论】:
以上是关于使用递归c ++找到最小的素数的主要内容,如果未能解决你的问题,请参考以下文章