您的位置:首页 > 其它

1013. 数素数 (20)

2017-03-28 14:53 246 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT1013 数素数 素数