HUSTOJ 1945: 素数

题目描述

输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。

输入

输入有多组数据。
每组一行,输入n。

输出

输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。

样例输入

70

样例输出

11 31 41 61

解题思路

获取素数使用素数筛法,注意筛选的for循环初始条件(int k=i+i)和步长(k=k+i)不要写错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int maxn=100+1;
bool p[maxn]={0}; // 0 is prime
int prime[maxn]={0};
void getprime()
{
for(int i=2; i<; i++)
{
if(!p[i])
{
prime[pnum++]=i;
for(int k=i+i; k<maxn; k=k+i)
{
p[k]=1;
}
}
}
}

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 10e4+1;

int main()
{
int n=0;
while(cin>>n)
{
int pnum=0;
bool p[maxn]={0}; // 0 is prime
int prime[maxn]={0};

for(int i=2; i<n; i++) // 素数筛选
{
if(false==p[i])
{
prime[pnum++]=i;
for(int j=i+i; j<n; j=j+i)
{
p[j]=true;
}
}
}
std::vector<int> res; // 存取结果
for(int i=0; i<pnum; i++)
{
if(prime[i]%10==1)
{
res.push_back(prime[i]);
}
}
if(res.empty())
{
cout<<-1<<endl;
}
else
{
for(int i=0; i<res.size(); i++)
{
cout<<res[i];
if(i<res.size()-1)
{
cout<<" "; // 空白字符处理
}
}
cout<<endl;
}
}
return 0;
}
分享到: