经过我深刻反思、检讨,解决了第一次运行超时的问题,正确代码在后面
本道题和另外一道有关素数的题有借鉴意义
https://blog.csdn.net/AFANTI_JK/article/details/104697562
为什么运行超时?
#include <stdio.h>
#define YES 1
#define NO 2
#define MAX 100000
int isprime(int i){
int j;
for(j = 2; j <= i / 2; ++j)
if(i % j == 0)
return NO;
return YES;
}
int main(){
int M, N, i, j, count;
scanf("%d %d", &M, &N);
count = 0;
for(i = 2, j = 1; count <= N && i < MAX; ++i){
if(isprime(i) == YES){
++count;
if(count >= M && count < N){
if(j % 10 != 0){
printf("%d", i);
printf(" ");
++j;
}else{
printf("%d", i);
printf("\n");
++j;
}
}else if(count == N){
printf("%d", i);
return 0;
}
}
}
}
正确代码(有图有真像)
#include <stdio.h>
#define YES 1 /* 是素数 */
#define NO 2 /* 不是素数 */
#define MAX 104730 /* 第100000个素数是104729 */
void get_primes(int s[], int lim){
int i, j;
int mult;
for(i = 2; i < lim; ++i){
if(s[i] != NO){ /* 若这个数没有被标记为“不是素数 */
mult = 2;
for(j = i; j*mult < lim; ++mult)/* 将它所有在MAX范围内的倍数都标记为不是素数 */
s[j*mult] = NO;
for(j = 2; j <= i/2 && j < 8; ++j)
if(i % j == 0)
break;
if(j > i/2 || j >= 8)
s[i] = YES;
}
}
}
void print_MN(int s[], int M, int N){
int count;
int i;
int order; /* 用于第几个输出 */
count = 0;
for(i = 2; count < M; ++i) /* 扫描到第M个素数 */
if(s[i] == YES)
++count;
for(--i; count <= N; ++i){
if(s[i] == YES){
order = (count - M + 1) % 10;
if(order != 0 && count != N) /* 如果不是每行的第十个输出 且不是最后一个输出*/
printf("%d ", i);
else if(order == 0) /* 若是输出每行的最后一个 */
printf("%d\n", i);
else if(count == N) /* 最后一个要输出的 */
printf("%d", i);
++count;
}
}
}
int main(){
int M, N;
int primes[MAX] = {0};
scanf("%d %d", &M, &N);
get_primes(primes, MAX); /* 得到素数表 */
print_MN(primes, M, N); /* 输出第M到第N个素数 */
}