由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 一个弱智问题,请大牛看看:找出1000000以内质数数目,要求快
相关主题
[合集] c/c++ simple question: efficiency of array/buffer acces问一个vim的问题
STL怎样同时重载()和< ?为什么redbox比netflix好用的多?
请教 一个关于loop的问题perl二维数组一问
Python里边file writer的问题linux 下从c++动态内存操作问题,heap size不够还是别的?
does the system guarantee this? (转载)C++中size_type怎么处理?
multi-thread 一问,怎么把string变为一个variable的名字 ?
OpenGL能否方便实现自定义图形的移动,擦除和分层显示?[合集] C++,一个函数完成后出segmentaion fault
新人5个包子请教问题,redhat读写文件的内存问题 (转载)又一个算法题
相关话题的讨论汇总
话题: int话题: np话题: buffer话题: yy话题: nprime
进入Programming版参与讨论
1 (共1页)
h******r
发帖数: 201
1
楼主只会这个基本方法,虽然work,但速度根本达不到要求。请教大牛,如何提高速度?
int nPrime(int N)
{
int nP=1;
for (int i=3; i<=N; i+=2)
{
bool yy=true;
for (int j=1; j {
if(i%j==0)
{
yy=false;
break;
}

}
if(yy==true) nP++;
}
return nP;
}
D*******a
发帖数: 3688
2
j loop only need to use known primes up to sqrt(i)

度?

【在 h******r 的大作中提到】
: 楼主只会这个基本方法,虽然work,但速度根本达不到要求。请教大牛,如何提高速度?
: int nPrime(int N)
: {
: int nP=1;
: for (int i=3; i<=N; i+=2)
: {
: bool yy=true;
: for (int j=1; j: {
: if(i%j==0)

S*A
发帖数: 7142
3

度?
你的程序 j=1 是错的,任何数字可以被 1 整除。
如果可以用内存换时间的话可以快很多:
你的改正过的程序,
time ./a.out
9592
real 0m0.426s
user 0m0.424s
sys 0m0.000s
我的:
time ./a.out
9592
real 0m0.001s
user 0m0.000s
sys 0m0.000s
N = 1000000 貌似快了 400 倍?
更大的数更快。
int nPrime(int N)
{
int n= N/2 - !(N & 1);
char *buffer;
int i,j;
int count =1;
if (N<3)
return N == 2;

buffer = calloc(1,n);
if (!buffer)
return -1;
for (i=1; i int step;
if (buffer[i])
continue;
count++;
step = i*2 + 1;
for (j=i + step; j buffer[j]= 1;
}
free(buffer);
return count;
}

【在 h******r 的大作中提到】
: 楼主只会这个基本方法,虽然work,但速度根本达不到要求。请教大牛,如何提高速度?
: int nPrime(int N)
: {
: int nP=1;
: for (int i=3; i<=N; i+=2)
: {
: bool yy=true;
: for (int j=1; j: {
: if(i%j==0)

m******u
发帖数: 12400
4
为什么j的叠加是2.
a*f
发帖数: 1790
5
re
找到一个质数放到hashtable里面,只检查是否被里面的质数群整除

【在 D*******a 的大作中提到】
: j loop only need to use known primes up to sqrt(i)
:
: 度?

b********0
发帖数: 62
6
如果空间没要求的话 直接开一个队列从2开始
每次取出队列头 然后把这个的倍数全部标记为删除
队列头如果是删除的就跳过 这样队列头肯定是质数
就是3楼的做法 没仔细看...

度?

【在 h******r 的大作中提到】
: 楼主只会这个基本方法,虽然work,但速度根本达不到要求。请教大牛,如何提高速度?
: int nPrime(int N)
: {
: int nP=1;
: for (int i=3; i<=N; i+=2)
: {
: bool yy=true;
: for (int j=1; j: {
: if(i%j==0)

S*A
发帖数: 7142
7
因为跳过偶数,只考虑奇数的因子。2 已经被放到 NP 里面了。
当然这有个 bug 就是如果 N=1 的话返回 1 是不对的,应该是 0.

【在 m******u 的大作中提到】
: 为什么j的叠加是2.
S*A
发帖数: 7142
8
思路类似,但是我的做法更加优化一些。
我直接跳过了偶数,这样数组的大小比你的算法减少
一半,循环也减少一半。当然数组下标的处理就要
仔细考虑这个下标折半的边界条件。

【在 b********0 的大作中提到】
: 如果空间没要求的话 直接开一个队列从2开始
: 每次取出队列头 然后把这个的倍数全部标记为删除
: 队列头如果是删除的就跳过 这样队列头肯定是质数
: 就是3楼的做法 没仔细看...
:
: 度?

1 (共1页)
进入Programming版参与讨论
相关主题
又一个算法题does the system guarantee this? (转载)
如何对下标运算,从而产生如下子序列。multi-thread 一问,
如果给随即函数rand[1,5] 如何产生rand[1,7] (转载)OpenGL能否方便实现自定义图形的移动,擦除和分层显示?
一个查找算法题新人5个包子请教问题,redhat读写文件的内存问题 (转载)
[合集] c/c++ simple question: efficiency of array/buffer acces问一个vim的问题
STL怎样同时重载()和< ?为什么redbox比netflix好用的多?
请教 一个关于loop的问题perl二维数组一问
Python里边file writer的问题linux 下从c++动态内存操作问题,heap size不够还是别的?
相关话题的讨论汇总
话题: int话题: np话题: buffer话题: yy话题: nprime