素数(九度教程第 51题)
1.题目描述:
输入一个整数 n(2<=n<=10000),要求输出所有从 1 到这个整数之间(不包括
1 和这个整数)个位为 1 的素数,如果没有则输出-1。
输入:
输入有多组数据。
每组一行,输入 n。
输出:
输出所有从 1 到这个整数之间(不包括 1 和这个整数)个位为 1 的素数(素数之
间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
样例输入:
100
样例输出:
11 31 41 61 71
来源:
2008 年北京航空航天大学计算机研究生机试真题
2.基本思路
该题已经明确给出了2≤N≤10000,因此我们可以在数据输入之前采用打表的方法,在数据输入之前的预处理是不算在算法运行时间内的,使得问题的时间复杂度在O(n)内解决。
至于怎么打表,可以采用素数筛的方法也可以采用逐一遍历标记的方法 ,推荐采用素数筛的方法,更为简洁。
3.代码实现
#include <iostream>
#define N 10001
using namespace std;
bool mark[N];//false表示未标记,是素数
int prime[N];
int primeSize=0;
void init(){
primeSize=0;
for(int i=0;i<=10000;i++){
mark[i]=false;
}
for(int i=2;i<=10000;i++){
if(mark[i]==true)
continue;//跳过被标记的元素
else{
if(i%10==1)
prime[primeSize++]=i;
for(int j=i*i;j<=10000;j++){
if(j%i==0 && mark[j]==false)
mark[j]=true;
}
}
}
}
int main()
{
int n;
int buf[N],size=0;
init();
while(scanf("%d",&n)!=EOF){
size=0;
for(int i=0;i<primeSize;i++){
if(prime[i]<n)
buf[size++] = prime[i];
}
for(int i=0;i<size;i++){
printf("%d",buf[i]);
if(i!=size-1)printf(" ");
else printf("\n");
}
}
return 0;
}