令 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
关键之处:
- 用数组保存素数,这样问题转换成了遍历数组,输出数组 下标M~N 的元素。
- 行末不留空格 + 每十个换行,注意一下。
代码:
#include <stdio.h>
#include <math.h>
#define MAXN 110000 //设为10万时,一个报错。11万时全对。
int main(void) {
int M, N, i, k, count;
int a[MAXN] = {0}; //这个数组用来保存2 ~ 11万之间的全部素数。
scanf("%d %d", &M, &N);
/*保存素数到数组,注意数组从a[1]开始存*/
for ( i = 2, k = 1; i < MAXN; i++ )
if ( isPrime(i) ) a[k++] = i;
/*输出第M到第N个素数,count计数用作算空格和换行*/
count = 0;
for ( i = M; i <= N; i++ ) {
if ( count % 10 != 0 ) printf(" ");
printf("%d", a[i]);
count++;
if ( count % 10 == 0 ) printf("\n");
}
return 0;
}
/*判断素数的函数*/
int isPrime ( int n ) {
int i, ret;
if ( n <= 1 ) ret = 0;
else {
for ( i = 2; i <= sqrt(n); i++ )
if ( n % i == 0 ) break;
if ( i > sqrt(n) ) ret = 1;
else ret = 0;
}
return ret;
}