目录
题目概述:
1013 数素数 (20 分)
令 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
分析思路:
1.这道题目跟PAT之前的1007 素数对猜想很类似,这里放上该题链接:
2.这里的关键是判断一个数是否是素数的办法是for (int i = 2; i <=sqrt(n); ++i)
只循环到开方大大降低时间复杂度,同时应该想到除了2之外的偶数全都不可能是素数,除去偶数也可以加快判断素数速度。
3.最后的格式控制也要注意,因为每一行最后都不能有多余空格,所以可以采用在除每行首个数字外的每个数字前加空格的办法。同时用num计数器来记录要不要加空格,要不要换行。
源代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
bool check(int n)
{
if (!(n % 2)&&(n!=2))//除去2之外的偶数不会是奇数
return false;
for (int i = 2; i <=sqrt(n); ++i)
{
if (!(n%i))
return false;
}
return true;
}
int main()
{
int M, N;
cin >> M >> N;
int i = 2;//素数从2开始
int j = 0;//j用来记录到第几个素数了
for (j = 1; j <M; ++i)
{
if (check(i))
++j;
}//循环结束后i的值就是第M个素数的值
int num = 0;
while (j<=N)
{
if (check(i))//一旦找到了素数
{
if (!num)//行首不加空格
printf("%d", i);//有素数就输出
else//非行首前加空格
printf(" %d", i);//有素数就输出
++j;
++num;//计数器加1
}
if (num == 10)//满十个就换行
{
printf("\n");
num = 0;
}
++i;
}
return 0;
}