PAT (Basic Level) Practise 1013 数素数

题目链接 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;
}

  依然很水。。==

posted @ 2015-09-10 20:59  KIWI的博客  阅读(508)  评论(1编辑  收藏  举报