文章目录
- 一【题目难度】
- 二【题目编号】
- 三【题目描述】
- 四【题目示例】
- 五【解题思路】
- 六【最终得分】
- 七【代码实现】
- 八【提交结果】
一【题目难度】
- 乙级
二【题目编号】
- 1013 数素数
三【题目描述】
- 令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数。
四【题目示例】
-
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
-
输出格式:
输出从 PM 到 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
五【解题思路】
- 由于涉及到素数,防止超出时间限制,需定义
math.h
中的sqrt
函数,减少时间复杂度。 - 题目给出范围10000个素数,但我们不知道最大是多少,虽然可以任取,这里用INT_MAX统一即便没有给范围,也能求。注意
INT_MAX
的头文件是limits.h
- 对于素数个数,用ans表示,即ans表示第ans个素数。
- 对于格式,题目要求最多10个数一行,且最后一位没有空格,那么就需要进行限制条件,即每%10不空格,最后一位不空格,通过kongge变量进行限制。
可以看到下面代码的框架,需要注意思路,判定是否空格不能与上面的自增变量交换位置,因为先自增就影响到了取模的换行和空格的判断。
六【最终得分】
- 20分
七【代码实现】
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<limits.h>
int isPrime(int x)
{if(x<2) return 0;int sqrt_x = sqrt(x);int i=0;for(i=2;i<=sqrt_x;i++){if(x % i == 0) return 0;}return 1;
}void countPrime(int begin, int end)
{int ans = 1;int i = 0;int kongge = 0;for(i=0;i<INT_MAX;i++){if(isPrime(i) && ans<begin) {ans++;}else if(isPrime(i) && ans>= begin && ans <= end) {printf("%d", i);ans++;kongge++;if(!((ans > end) || (kongge%10 == 0))) printf(" ");if(kongge % 10 == 0 && ans < end) printf("\n");} else if(ans > end) return;}}
int main(int argc, char *argv[]) {int begin, end;scanf("%d %d", &begin, &end);countPrime(begin, end);return 0;
}