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
解题心得:
这道题开始困扰了我好久,先是发现题目中带有坑,后面又是格式错误,分享一下吧。
- 说是Pi表示第i个素数,例如2、3、5、7、11,所以题干的输入格式里面5指代的就是11,故27指的就是103了。
格式错误。要满足两个条件,一是每一行的行末不能有“ ”;其次是最后一个元素不能有“ ”。注意好细枝末节就可以了。
简述一下自己的思路:
先定义两个变量pm,再进行素数的判断。随着i的增加判断出是素数,那么pm就会自减,当pm=0时就找到了M下对应的素数begin。个人觉得比较简单,但是可能会增加时间复杂度。
尽可能进行小范围的判断,例如执行到平方根就可以了。
判断素数的方法有很多,还需要多学习几种。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int pm, pn;
int begin, end;
int num[10000], k = 0;
cin >> pm >> pn;
for (int i = 2; pm>0 ; i++)
{
for (int j = 2; j != sqrt(i); j++)
{
if (i%j==0 &&i !=2)
{
break;
}
else if (j>sqrt(i))
{
begin = i;
pm--;
break;
}
}
}
for (int i = 2; pn > 0; i++)
{
for (int j = 2; j != sqrt(i); j++)
{
if (i%j == 0 && i != 2)
{
break;
}
else if (j>sqrt(i))
{
end = i;
pn--;
break;
}
}
}
for (int i = begin; i <= end; i++)
{
for (int j = 2; j != sqrt(i); j++)
{
if (i%j == 0 && i != 2)
{
break;
}
else if (j>sqrt(i))
{
num[k++] = i;
break;
}
}
}
for (int i = 0; i <= k-1; i++)
{
if (i==k-1)
{
cout << num[i];
break;
}
cout << num[i];
if ((i+1)%10!=0)
cout <<" ";
else
cout << endl;
}
cout << endl;
return 0;
}