您的位置:首页 > 其它

PAT乙级(Basic Level)真题 1003.数素数

2016-11-21 22:16 295 查看
题目地址



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
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: