题目:
令 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<math.h>
bool isPrime(int num)
{
if(num==2||num==3)
return true;
if(num%6!=1&&num%6!=5)
return false;
int temp=sqrt(double(num));
for(int i=5;i<=temp;i+=6)
if(num%i==0||num%(i+2)==0)
return false;
return true;
}
转载https://blog.csdn.net/qq_15092079/article/details/80804326
算法的问题解决了。我首先想到的问题是,需要怎么数素数,素数数到哪里结束?开始我甚至是想要不直接把素数数到 。但是根本就不行,结果出不来。于是又想了一会儿,发现循环的终止条件可以是次数小于n.因为只需要数到第n个素数即可。
一次性通过代码:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
bool isPrime(int num)
{
if(num==2||num==3)
return true;
if(num%6!=1&&num%6!=5)
return false;
int temp=sqrt(double(num));
for(int i=5;i<=temp;i+=6)
if(num%i==0||num%(i+2)==0)
return false;
return true;
}
int a[100000000];
int main()
{
int m,n,p=1,i=0,c;
scanf("%d%d",&m,&n);
if(m<=n)
{
while(i<n&&p++)//关键的终止条件
{
if(isPrime(p))
{
a[i]=p;
c=i;
i++;
}
}
}
int x=0;
for(c=m-1;c<n-1;c++)
{
x++;
if(x%10)
printf("%d ",a[c]);
else
printf("%d\n",a[c]);
}
printf("%d\n",a[n-1]);
return 0;
}