附上题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/9948053099633541
这道题目,有一点需要注意的就是,找出一个包含了10000个素数的范围,下面提供一下简单的代码:
这段代码基本上包含三个部分:
1.怎么判断一个数是素数
2.怎么判断某个范围内的数哪些是素数,并且保存下来
第一点和第二点都可以参考我的另一篇博客:https://mp.csdn.net/postedit/89648390
3.在主函数里面输出,保证格式正确
分成以上三点进行思考,可以保证思路清晰。
int getPrime()
{
memset(judge,true,sizeof(judge)); //将数组初始化为TRUE
int count = 0; //用来计算在0~num范围内素数的个数
for(int i = 2; i <= maxn; i++)
{
if( judge[i]== true && isPrime(i)== true)
{
prime[count++] = i;
//如果i是素数的话,就将i的倍数全部变为FALSE,false表示这个数不是素数
for(int j = i+i;j <= maxn; j += i)
judge[i] = false;
}
}
return count; //通过返回值就可以判断素数的个数,然后再根据返回值调整maxn和maxn1的大小,不正
//内存不超,也保证不会出现段错误
}
下面是完整的代码,简单叙述一下自己在做本道题目遇到的麻烦(调试了好几次,都出现各种各样的问题,怪自己太粗心):
1.找到一个包含10000个素数的范围,确定maxn和maxn1的范围,注意maxn1不是10000,而是根据你选的maxn来确定;
2.按照格式输出,基本没啥问题,但是新手需要多注意一下呢!
#include<bits/stdc++.h>
using namespace std;
const int maxn = 110000;
const int maxn1 = 11000;
int prime[maxn1]; //用来存放某一个范围内的素数
bool judge[maxn];
//初始化为true,表示所有的数都满足条件,然后再将一些不是素数的元素的值置成false
bool isPrime(int num)
{
//判断一个数是不是一个素数
if(num <= 1)
return false;
for(int i = 2; i <=(int)sqrt(num*1.0); i++)
{
if(num % i ==0)
return false;
}
return true;
}
// 埃氏筛法求某一个范围内素数
void getPrime()
{
memset(judge,true,sizeof(judge)); //将数组初始化为TRUE
int count = 0; //用来计算在0~num范围内素数的个数
for(int i = 2; i <= maxn; i++)
{
if( judge[i]== true && isPrime(i)== true)
{
prime[count++] = i;
//如果i是素数的话,就将i的倍数全部变为FALSE,false表示这个数不是素数
for(int j = i+i;j <= maxn; j += i)
judge[i] = false;
}
}
//return count;
}
int main()
{
int m,n;
scanf("%d%d",&m,&n);
getPrime();
//格式化输出
int add = 0;
for(int i = 0; i <= n-m;i++)
{
add++;
if(add < 10)
{
if(i == n-m)
printf("%d\n",prime[i+m-1]);
else
printf("%d ",prime[i+m-1]);
}
if(add == 10)
{
printf("%d\n",prime[i+m-1]);
add = 0;
}
}
return 0;
}