分数 20
作者 CHEN, Yue
单位 浙江大学
令 Pi表示第 i 个素数。现任给两个正整数 M≤N≤10 4,请输出 P M到 P N的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 P M到 P N的所有素数,每 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
思路分析:
错误分析:
错误的原因在于,限制了i最大10001但是素数远远达不到10000
因此不应该限制i的范围,改为num为10000则停止
//#include<stdio.h>
//int isPrime(int n){
// if(n <= 1){
// return 0;
// }
// for(int i = 2; i*i <= n; i++){
// if(n % i == 0){
// return 0;
// }
// }
// return 1;
//}
//int main(){
// int m,n;
// scanf("%d%d",&m,&n);
// int flag = 0;
// int prime[10001];
// int num = 0;
// for(int i = 1;;i++){
// if(isPrime(i)){
// prime[++num] = i;
// }
// if(num == 10000){
// break;
// }
// }
// int count = 0;
// for(int i = m;i <= n; i++){
// if(flag++>0 && flag <=10){
// printf(" ");
// }
//
// printf("%d",prime[i]);
// count++;
// if(count == 10){
// printf("\n");
// flag = 0;
// count = 0;
// }
// }
//}
代码实现:
#include<stdio.h>
/*
因为题目要求输出某个范围内的素数,暴力的方法肯定好想,就是把整个范围内的所有素数都存储到数组中,
然后再按照要求的范围输出,
但是这样多了很多不必要的步骤。我们可以直接从2开始遍历,设置记录已经判断出的素数的个数,
如果素数的个数到了m这个数,就开始输出,到n这个数停止。
*/
int isPrime(int n){
if(n <= 1){
return 0;
}
for(int i = 2; i*i <= n; i++){
if(n % i == 0){
return 0;
}
}
return 1;
}
int main(){
int m,n;
int count = 0;//素数个数
scanf("%d%d",&m,&n);
int index = 0;
for(int i = 2; ; i++){
if(isPrime(i)){
count++;
if(count >= m){
printf("%d",i);
index++;
if(index % 10 == 0){
printf("\n");
}
else if(count < n){
printf(" ");
}
}
}
if(count == n){
break;
}
}
}