1913: 快速查找素数


1913: 快速查找素数

时间限制: 4 Sec  内存限制: 64 MB
提交: 132  解决: 48
您该题的状态:已完成
[提交][状态][讨论版]

题目描述

现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。

输入

给出一个正整数数N(N<=2000000) 但N为0时结束程序。 测试数据不超过100组

输出

将2~N范围内所有的素数输出。两个数之间用空格隔开

样例输入

<span style="color:#333333"><span style="color:black">5
10
11
0</span></span>

样例输出

<span style="color:#333333"><span style="color:black">2 3 5
2 3 5 7
2 3 5 7 11
</span></span>

提示

 

来源

这题用常规方法,绝对时间超限,用筛选法求素数,开了个2000000的数组,居然没有爆内存,哈哈,

还有用memset置不了一,这点很好奇。找到原因了,该函数对数组操作时只能用于数组的置0或-1,其他值无效。

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define N 2000000//N的大小可以根据需要变化
int a[N];//利用数组的下标记录要判断的数字
int main()
{
    memset(a,0,sizeof(a));//对数组a进行初始化为0,不是素数的标记为1,剩下为0的就是素数了
    a[1]=1;//1既不是素数也不是合数,先标记为0
    for(int i=2; i<=sqrt(N); i++)
    {
        if(a[i]==0)//如果i是素数
        {
            for(int j=2; j*i<=N; j++) //循环标记的范围是i*j<N
            {
                a[i*j]=1;//如果i是素数,那么i*j肯定不是素数
            }
        }
    }
    int n,m,j,i;
    while(~scanf("%d",&n),n)
    {
        for(i=2,j=0;i<=n;i++)
        if(a[i]==0)
        {
            if(j==0)
            cout<<i;
            else
            cout<<" "<<i;
            j++;
        }
        cout<<endl;
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_41325698/article/details/81324033