令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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define IMAX 1000010//IMAX 得设置这么大,设6位数,后台有一个测试数据无法覆盖
int prime[IMAX]={0};
bool isPrime(int n)
{
if(n<=1)return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;++i){
if(n%i == 0)return false;
}
return true;
}
void find_Prime(int n)//n是用来记录需要的素数个数,到了就停止,没必要全算,如果不设n,因为IMAX设置的很多,会导致运行超时
{
int num=0;//用来记录素数个数的底坐标
for(int i=2;i<IMAX;i++){
if(isPrime(i)){
prime[num++]=i;
if(num>n)break;
}
}
}
int main()
{
int pm=0,pn=0;
scanf("%d%d",&pm,&pn);
int count=0;//用于每10个数输出一行
find_Prime(pn);
for(int j=pm-1;j<=pn-1;++j){//-1是因为prime数组是从0开始存数据的
count++;
if(j==pn-1){//因为行末不能有多于空格,所以要特殊处理
printf("%d",prime[j]);
break;
}
if(count<10){
printf("%d ",prime[j]);
}
else{
printf("%d\n",prime[j]);
count=0;
}
}
return 0;
}