https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112
思路1 朴素判断
例如,要输出第5-27个素数,先找到第4个素数,重置计数器,再输出;
#include <stdio.h>
int isprime(int a)
{
for (int i=2; i*i<=a; ++i)
if (a%i==0)
return 0;
return 1;
}
int main()
{
int i,start,end,cnt=0;
scanf("%d %d",&start,&end);
for ( i=2; cnt<start-1; ++i)
if (isprime(i))
++cnt;
cnt=0;
while (cnt<end-start+1) {
if (isprime(i)) {
++cnt;
printf("%d",i);
if (cnt%10==0)
printf("\n");
else if (cnt<end-start+1)
printf(" ");
}
++i;
}
}
思路2 爱拉托逊斯筛选法
即:如果一个数是素数,那么它的所有倍数(大于1倍)一定不是素数。
通过该法先找出可能范围内的所有素数,存在prime数组,再按下标输出。是一种空间换时间的方法。
#include <stdio.h>
const int maxn=110000; //11万即可
int prime[maxn],num=0; //prime存所有素数 num是个数
bool istimes[maxn]= {0}; //istimes记录是否是某个数的倍数
void find_prime(int n) //找前n个素数
{
for (int i=2; i<maxn; ++i) {
if (!istimes[i]) {
prime[num++]=i;
if (num>=n) break;
for (int j=2; j*i<maxn; ++j)
istimes[j*i]=1;
/*上面两行也可以这样:
for (int j=i+i; j<maxn; j+=i)
istimes[j]=1;
*/
}
}
}
int main()
{
int i,start,end,cnt=0;
scanf("%d %d",&start,&end);
find_prime(end);
for (int i=start; i<=end; ++i) {
++cnt;
printf("%d",prime[i-1]);
if (cnt%10==0)
printf("\n");
else if (cnt<end-start+1)
printf(" ");
}
}