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; }
依然很水。。==