-
题目描述:
-
输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
-
输入:
-
输入有多组数据。
每组一行,输入n。
-
输出:
-
输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
-
样例输入:
-
100
-
样例输出:
-
11 31 41 61 71
代码:
#include <stdio.h>
bool s[10001];
int ans[10000];
void init() {
int i,j=0,k;
for(i=2;i<=10000;i++)
s[i] = false;
for(i=2;i<=10000;i++) {
if(s[i] == true) continue;
ans[j++] = i;
for(k=i*i;k<=10000;k+=i)
s[k] = true;
}
}
int main() {
int n,i;
init();
while(scanf("%d",&n)!=EOF) {
bool first = true;
for(i=2;i<n;i++) {
if(!s[i] && i%10==1) {
if(first) {
printf("%d",i);
first = false;
}
else
printf(" %d",i);
}
}
if(first)
printf("-1");
printf("\n");
}
return 0;
}
如何找出0到1000000中所有的素数?可以依次枚举每个数,判断每个数是否是素数,但是这样时间复杂度
太高,不具有技巧性。
本题采用了一种更为优雅的方法。
若一个数不是素数,则必存在一个小于它的素数是它的因数。假如我们已经获得小于某一个数的所有素数,我们
只需确定该数不能被这些素数整除,即可确定该数为素数。
当我们获得一个素数时,就把它所有的倍数标记为非素数,如果一个数没有被任何小于它的素数标记,则它为非
素数。
----------这个方法就称为-----素数筛法。
1.定义init()函数,计算从0到10000内所有的素数,只需在main函数开始处运行一次即可。
2.注意不存在素数的要输出-1
3.当判定i为素数时,标记其所有倍数时,我们并没有从2*i开始,而是从i*i开始。因为对于i*k(k<i)必已经求过了k的倍数,所以它
已经被标记过了。避免了重复的计算。