题目链接 http://www.patest.cn/contests/pat-b-practise/1013
题目大意:输入两个数M和N,输出第M个到第N个素数,输出控制为每行十个,每行最后一个数后不可以带空格
我的想法是先用筛选法求出相当多的素数,然后将素数全部存到动态数组vector中,而后对vector中所有的书进行排序,而后根据格式输出即可
筛选法的原理是素数的倍数都是合数,若要求出2-n的区间里所有的质数,则首先把0和1设为合数,而后从2开始遍历,每发现一个质数Ki,都把ki小于n的倍数标记为合数,遍历到合数则直接跳过。这样遍历一遍就可以把所有的合数全部标记出来,那么没有被标记的自然就是素数。
学到了vector的排序方法。。。sort( v.begin(),v.end() )...
PS : 忘了处理最后一行最后一个数(如果最后一行没有到十个数的情况)后面的空格(是不需要的)。PE了一发
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 1000005
int a[1000005];
vector <int> v;
void oddp()
{
for( int i=2; i<=1000000; i++ )
a[i]=1;
a[0]=0;
a[1]=0;
for( int i=2; i<=1000000; i++ )
{
if(a[i]==1)
{
for( int j=i*2; j<=1000000; j+=i ) //倍数都不是素数
a[j]=0;
}
}
}
int main()
{
oddp();
for( int i=2; i<=1000000; i++ )
if( a[i]==1 )
v.push_back(i);
sort( v.begin(),v.end() );
int m,n;
while ( scanf( "%d%d",&m,&n )!=EOF )
{
int flag=0;
for( int i=m; i<n; i++ )
{
if( flag< 9)
{
printf( "%d ",v[i-1] );
flag++;
}
else if( flag==9 )
{
printf( "%d",v[i-1] );
flag++;
}
if( flag==10 )
{
printf( "\n" );
flag=0;
}
}
printf( "%d\n",v[n-1] );
}
return 0;
}
依然很水。。==