一【题目难度】
- 乙级
二【题目编号】
- 1013 数素数 (20 分)
三【题目描述】
- 令 P i P_i Pi 表示第 i i i 个素数。现任给两个正整数 M ≤ N ≤ 1 0 4 M≤N≤10^4 M≤N≤104 ,请输出 P M P_M PM 到 P N P_N PN 的所有素数。
四【题目示例】
-
输入格式:
输入在一行中给出 M M M 和 N N N,其间以空格分隔。 -
输出格式:
输出从 P M P_M PM 到 P N P_N PN 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 -
输入样例:
5 27 -
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
五【解题思路】
- 因为题目要求输出某个范围内的素数,暴力的方法肯定好想,就是把整个范围内的所有素数都存储到数组中,然后再按照要求的范围输出,但是这样多了很多不必要的步骤。我们可以直接从2开始遍历,设置记录已经判断出的素数的个数,如果素数的个数到了m这个数,就开始输出,到n这个数停止。里面需要注意换行和空格的问题。素数的筛选方法使用的是1007 素数对猜想的方法
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<math.h>
#include<stdbool.h>
bool isPrimeNumber(int x)
{
int sqr = (int)sqrt(1.0 * x);
for(int i = 2;i<=sqr;i++)
{
if(x % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int m,n,count = 0,num = 2,index = 0;
scanf("%d %d",&m,&n);
while(count < n)
{
if(isPrimeNumber(num))
{
count++;
if(count >= m)
{
index++;
printf("%d",num);
if(index % 10 == 0)
{
printf("\n");
}
else if(count < n)
{
printf(" ");
}
}
}
num++;
}
return 0;
}