您的位置:首页 > 其它

PAT-乙级-1013

2016-12-29 08:39 204 查看


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

【解析】
这道题我觉得还是有必要写一下的,就是怎么判断某个范围内的素数,这显然有快速的算法,我之前算素数的算法超时以后其实可以拿这个算比较简单了。就是看前面的素数是
不是后面素数的因子。肯定要判断2既然后面的如果取余2为0那吗说明是偶数如果不是那就看他能不能取余前面的素数如果可以说明他不是素数

#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int *pre = new int[11000];//申请一块空间
int n,m,k=0,i,j;
scanf("%d%d",&n,&m);
pre[k++] = 2;
for (i = 3; i <=120000; i++)
{
for (j = 0; j*j < k; j++)
{
if (i%pre[j] == 0)break;//这里的话表示如果i能被在k开根号以前的素数整除的话,那就不是素数,否则就是素数
//这里之所以是j的条件是j*j<k其实这是个优化可以少进行几次。是个求素数的好方法
}
if (j*j>=k)
{
pre[k++] = i;
}
}
int count= 0;
for (i =n-1;i<m;i++)
{
count++;
if (count%10 == 0)
{
cout<<pre[i]<<endl;//输出10个要换行
continue;
}
if (i ==m-1)
{
cout<<pre[i]<<endl;
break;
}
cout <<pre[i]<<" ";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: