用递归求素数的代码

横竖弯钩 2009-08-02 11:49:08
#include<iostream>
#include<cmath>
using namespace std;

int sushu(int,int*);

int main()
{
const int N=50000;
int a[N/2+1];
int m=sushu(N,a);
for (int i=0;i<=m;i++)
{
cout<<a[i]<<"\t";
}
return 0;
}

int sushu(int n,int a[])
{
if(n>2)
{
int m=sushu(n-1,a);
for(int i=0;a[i]<=sqrt(n);i++)
{
if(n%a[i]==0)
return m;
}
a[++m]=n;
return m;
}
a[0]=2;
return 0;
}

刚学了递归,练习下
数组长度定的有点问题,这个长度该怎么定
这个程序还能怎么改进
谢谢高手们
小弟新手
...全文
503 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-08-03
  • 打赏
  • 举报
回复
4楼算法是基于一个归纳的结果,就是5以后的相邻素数之间的间隔是42424626循环的。我不知道这种算法是否有严格的证明,不过个人认为这样做好处不明显。首先除非这个有严格的数学证明,这样做也很有漏掉一些素数的可能性。其次因为小素数(32bit以内)算的本来就快,这种加速没有必要。
[Quote=引用 8 楼 zgx007 的回复:]
引用 5 楼 mu_yang 的回复:
a[i] <=sqrt(n)
这个很难看

说得有道理
4楼算法不理解
应该所验证一定范围内素数的算法吧

[/Quote]
横竖弯钩 2009-08-03
  • 打赏
  • 举报
回复
“递归消耗太多”
学习了
这个只所为了练习一下递归
mu_yang 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zgx007 的回复:]
引用 5 楼 mu_yang 的回复:
a[i] <=sqrt(n)
这个很难看

说得有道理
4楼算法不理解
应该所验证一定范围内素数的算法吧

[/Quote]

我也不理解
甚至我连楼主要求什么都不清楚
  • 打赏
  • 举报
回复
嗯,有道理
其实要不递归也挺容易的。

[Quote=引用 7 楼 arong1234 的回复:]
你的第一个问题不在于数组长度,而在于递归。递归对堆栈的消耗太多,你的程序很快就可能造成堆栈溢出。
递归应该只用于理论分析,任何实际的代码实现应该都避免使用递归

至于数组长度,其实无所谓。作为练习,使用数组其实100个元素和100000万个都没有多少差别,无非就是循环多一次少一次的问题。如果你想在此基础上进行优化,可以从以下几个方面考虑:
1. 递归改成非递归
2. 数组改成其他数据结构(如链表)
3. 素数算法优化

[/Quote]
横竖弯钩 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mu_yang 的回复:]
a[i] <=sqrt(n)
这个很难看
[/Quote]
说得有道理
4楼算法不理解
应该所验证一定范围内素数的算法吧
arong1234 2009-08-03
  • 打赏
  • 举报
回复
你的第一个问题不在于数组长度,而在于递归。递归对堆栈的消耗太多,你的程序很快就可能造成堆栈溢出。
递归应该只用于理论分析,任何实际的代码实现应该都避免使用递归

至于数组长度,其实无所谓。作为练习,使用数组其实100个元素和100000万个都没有多少差别,无非就是循环多一次少一次的问题。如果你想在此基础上进行优化,可以从以下几个方面考虑:
1. 递归改成非递归
2. 数组改成其他数据结构(如链表)
3. 素数算法优化
  • 打赏
  • 举报
回复
基本可以说没有办法。

如果说有办法的话,倒是有一个,用类似于泛型的方式。
初始值16;
如果到了16;就重新分配*2的空间

如果不想自己处理,就用 vector<int>
mu_yang 2009-08-03
  • 打赏
  • 举报
回复
a[i]<=sqrt(n)
这个很难看
superspring 2009-08-03
  • 打赏
  • 举报
回复
C++没有变长数组

所以你定一个足够大的就可以了
还有,不知道为什么你要用递归,用递归其实效率不高

给一个非递归算法,根据素数的性质


bool isPrime(unsigned int num)
{
if(num==2&&num==3&&num==5) return true;
unsigned long c=7;
if(num%2==0||num%3==0||num%5==0) return false;
int maxc=int(sqrt(num));
while(c <=maxc)
{
if(num%c==0) return false;
c+=4;
if(num%c==0) return false;
c+=2;
if(num%c==0) return false;
c+=4;
if(num%c==0) return false;
c+=2;
if(num%c==0) return false;
c+=4;
if(num%c==0) return false;
c+=6;
if(num%c==0) return false;
c+=2;
if(num%c==0) return false;
c+=6;
}
return true;
}
横竖弯钩 2009-08-03
  • 打赏
  • 举报
回复
这样定义没有错误
问题是长度根据 N该定为多少
而不至于浪费空间和越界
superspring 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liujianwish 的回复:]
int a[N/2+1];//不能这样定义一个变长的数组,要动态分配使用new
改成
int *a=new int[N/2+1]
之后的a都改成*a
[/Quote]

这样定义没问题啊

数组放在栈上或者堆上都是可以的
liujianwish 2009-08-03
  • 打赏
  • 举报
回复
int a[N/2+1];//不能这样定义一个变长的数组,要动态分配使用new
改成
int *a=new int[N/2+1]
之后的a都改成*a

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧