PAT 乙级 (2) 数素数
题目
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
输入描述
输入在一行中给出M和N,其间以空格分隔。
输出描述
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
示例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
思考和总结
- 素数怎么判断(假设待判断数为a)
1.排除2后快速判断的方法:不能是偶数而且只需要判断到a1/2,即可。
bool iS(int a)
{
for(int i = 3;i <= sqrt(a);i = i + 2)
{
if ((a % i) == 0)
return 0;
}
return 1;
}
2.网上较好的包括2的判断方法:
bool isP( int n ){
int i = 2;
for( i = 2; i <= n / i; i ++){
if( n % i == 0 )
return false;
}
return true;
}
3.个人认为可以直接计算奇数的因数加快计算:
bool isP( int n ){
if (n == 2)
return true;
for( i = 3; i <= n / i; i = i + 2){
if( n % i == 0 )
return false;
}
return true;
}
- 输出空格的处理
①这里的10个一行比较容易处理。
②容易忽略,易错点:最后一个素数如果没有到达该行的结束,容易多出一个空格。
(一开想通过**getchar()**处理,但是没弄出来,最后直接判断最后一个数的时候特例打印)
个人代码(c++)
#include <iostream>
#include <cmath>
using namespace std;
bool iS(int a)
{
for(int i = 3;i <= sqrt(a);i = i + 2)
{
if ((a % i) == 0)
return 0;
}
return 1;
}
int main()
{
int m,n;
cin >> m >> n;
int flag = 1;
if (n == 1)
{
cout << "2";
return 0;
}
else
{
if(m == 1)
{
cout << "2 ";
}
}
for (int i = 3;;i = i + 2)
{
if (flag == n)
{
cout << i - 2;
break;
}
if (iS(i))
{
flag++;
if (flag >= m && flag < n)
{
cout << i;
if((flag-m) % 10 == 9 && (flag - m) != 0)
cout << endl;
if((flag-m) % 10 != 9 || (flag - m) == 0)
cout << " ";
}
}
}
return 0;
}
牛客网(Dalao)代码
#include <stdio.h>
bool isP( int n ){
int i = 2;
for( i = 2; i <= n / i; i ++){
if( n % i == 0 )
return false;
}
return true;
}
int main()
{
int pm = 0, pn = 0;
int i = 0, j = 0, cnt = 0, flg = 0;
while( scanf("%d %d", &pm, &pn) != EOF ){
cnt = 0; flg = 0;
for( i = 2; ; i ++){
if( isP(i) ){
cnt ++;
if( cnt >= pm && cnt <= pn ){
flg ++;
if( flg < 10 && cnt < pn ) printf("%d ", i);
else if( flg < 10 && cnt == pn ) printf("%d\n", i);
else{
flg = 0;
printf("%d\n", i);
}
}
if( cnt == pn ) break;
}
}
}
return 0;
}
注:以上思路均来源于网上。文章目的只是为了自己学习总结回顾,欢迎指出错误,相互学习。如有冒犯,请联系删除,谢谢!