素数筛法【九度教程第51题】

论坛 期权论坛 脚本     
匿名技术用户   2020-12-21 23:28   11   0

题目描述:

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

输入:

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

输出:

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

样例输入:

100

样例输出:

11 31 41 61 71

来源:
2008 年北京航空航天大学计算机研究生机试真题

思路

素数筛法:用筛法求素数的基本原理,是把从1开始的某一范围内的正整数从小到大顺序排列,逐步筛掉非素数留下素数。
代码思路:

  1. 定义素数筛法子函数,求出所有在范围内的素数
  2. 调用子函数从素数数组中取出在范围内的所有满足条件的素数打印出来

### 代码 ```c #include

}
int main() {
init();
int bound;

while (scanf("%d", &bound) != EOF) {
 bool firstout = true; //当前输出是第一个输出 注意一定要放到循环里面!!
 int m = 0; //局部变量!! 每个数都要从头开始!!
 while (prime[m] < bound ) {
  if (prime[m] % 10 == 1 ) {//末尾为1
   if (firstout == true) {
    printf("%d", prime[m]);
    firstout = false;
   }
   else {
    printf(" %d", prime[m]);
   }
  }
  m++;
 }

 if (firstout == true) {//如果还为true的话说明没改过 也就是没有进入循环找到满足条件的
  printf("-1\n");
 }
 else printf("\n");
}
return 0;

}

代码里的注意点如下:
1. **全局变量的定义**:包括素数个数`primenum`、素数数组`prime`、标志数组`flags`,因为有一个子函数,想要在主函数内继承子函数的结果,就需要定义全局变量
2. **局部变量的定义**:主函数中的`m`和`firstout`,都是在每个不同输入的情况下需要重新计算的,不能在不同输入时有继承效果,一定要注意该变量的作用范围!
3. **数组长度的定义**:`flags[MAXSIZE+1]`因为flags是用来标志对应的数是否为素数,这里定义为+1是为了取索引的方便:数字2是否为素数——flags[2]而不是flags[1]这样
4. **筛法小技巧**:判定i为素数,要标记其所有倍数为非素数时,没有从`2*i`开始标记,而是直接从`i*i`开始标记,因为`i*k(k<i)`一定在之前就已经标记过了,因为它还是k的倍数。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP