PTA 7-126 显示指定范围内的素数
输入整数m,将所有大于1小于整数m的素数存入所指定的数组中(数组最多只存放100个素数,超过则提示“OVERFLOW”),输出各素数——若输入的m≤2,则提示“NO”,程序终止。注:素数(Prime Number),亦称质数,指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
输入格式:
输入一个非0的整数。
输出格式:
素数的输出格式为每个素数5列宽、右对齐、每行显示15个。
输入样例:
100
输出样例:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97
输入样例:
568
输出样例:
OVERFLOW
输入样例:
1
输出样例:
NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码:
#include <stdio.h>
#include <math.h>
#define MAX_SIZE 100
int isPrime(int n) {
if (n == 2 || n == 3) {
// 特殊情况
return 1;
}
if (n <= 1 || n % 2 == 0) {
// 排除非素数
return 0;
}
for (int i = 3; i <= sqrt(n); i += 2) {
// 从3到sqrt(n)枚举
if (n % i == 0) {
// 如果找到一个可以整除n的i,n就不是素数
return 0;
}
}
return 1;
// n不是2或者3,且没有被2到sqrt(n)之间的任何一个奇数整除,n是素数
}
int main() {
int m;
int primes[MAX_SIZE];
int count = 0;
scanf("%d", &m);
//输入的m≤2,则提示“NO”
if (m <= 2) {
printf("NO\n");
return 0;
}
// 查找所有 2 ~ m - 1 的素数,存储在数组primes中
for (int i = 2; i < m; i++) {
if (isPrime(i)) {
// 判断i是否是素数
if (count >= MAX_SIZE) {
//数组最多只存放100个素数,超过则提示“OVERFLOW”
printf("OVERFLOW\n");
return 0;
}
primes[count++] = i;
// 将素数存储到数组中
}
}
// 输出素数
for (int i = 0; i < count; i++) {
printf("%5d", primes[i]);
if ((i + 1) % 15 == 0) {
//每行显示15个
printf("\n");
}
}
}
解题思路
显示指定范围内的素数的步骤:
step 1:考虑特殊情况和排除非素数的情况;
step 2:通过枚举法找到是否是素数;
step 3:查找所有 2 ~ m - 1 的素数,并存储在数组primes中;
step 4:将素数存储到数组中,输出素数。
归属知识点
数组,循环结构,选择结构