题目地址
http://www.nowcoder.com/pat/6/problem/4079
解题思路——埃拉托斯特尼筛法
筛法思想:素数的倍数一定不是素数
代码思路:开2个数组,分别存放{筛出来的素数}、{2.3.5.7.11...最大可能的素数}。先设所有的数都是素数,然后从2开始,逐个排除该素数的所有倍数,剩下的数就是素数,存入素数数组。
思路来源:Shura
AC代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int M = 10001;
const int N = 104730;//第10000个素数是104729
int prime[M];
int number[N];
int main()
{
int m,n;
scanf("%d%d",&m,&n);
memset(number,1,sizeof(number));//设2~N全都是素数
int tot=0;
for( int i=2;i<=N;++i ){
if( number[i]==1 ){//将第一个数(2)和没有被排除的数存入素数数组
prime[tot++] = i;
}
for( int j=2*i;j<=N;j+=i ){//排除素数i的所有倍数
number[j] = 0;
}
}
int printed=0,isfirst=1;
for( int i=m-1;i<n;++i ){
if( isfirst ){
printf("%d",prime[i]);
isfirst=0;
++printed;
}
else{
printf(" %d",prime[i]);
++printed;
}
if( printed%10==0 ){//打印,满十换行
printf("\n");
isfirst=1;
}
}
return 0;
}