题目描述
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
输入描述:
输入在一行中给出M和N,其间以空格分隔。
输出描述:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
想法:1.怎么求出第n个素数
素数的定义:在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
暴力:遍历一遍看这个数能不能被比它小的数整除
得到素数后记录。只计算能否被比他小的素数整除。
链接:https://www.nowcoder.com/questionTerminal/e0fb49acb75f47e8b6fa2077d9071799
基本思想:素数的倍数一定不是素数
实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数),先假设所有的数都是素数(初始化为0),从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,进行同样的处理,直到最后,数组中依然为0的数即为素数。
说明:整数1特殊处理即可。
#include <iostream>
#include <cstring>
using namespace std;
#define N 10005
#define M 200005
bool check[M];
long prime[N];
int main()
{
int pn=0;//pn为prime number
memset(check,0, sizeof(check));
for(int i=2;pn <= N;i++){
if(!check[i]) prime[pn++]=i;
//先检查是否是素数,是的话加入素数数组
for(int j=i*2;j<=M;j=j+i){
check[j]=true;
}
}
int m,n,c=0;
cin >> m >> n;
for(int i=m;i<=n;i++){
cout << prime[i-1];
if(++c%10==0&&i!=n) cout << endl;
else if(i!=n) cout << " ";
}
return 0;
}