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的素数一定是奇数,奇数 × 偶数 = 偶数(不是素数),故只需将需要判别的数输入为奇数,且测试时仍只观察能否被奇数整除,加快判别速度
程序中其他循环函数的原理相同。
1 bool isprime(int num){ //要求num为奇数 2 if(num==1) return false; 3 if(num==2) return true; 4 int sqt; 5 sqt = int(sqrt(num)); 6 for(int i =3;i<=sqt;i+=2) //每次循环加2 7 if(num%i==0) return false; 8 return true; 9 }
C++ 代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 bool isprime(int num){ //要求num为奇数 5 if(num==1) return false; 6 if(num==2) return true; 7 int sqt; 8 sqt = int(sqrt(num)); 9 for(int i =3;i<=sqt;i+=2) //每次循环加2 10 if(num%i==0) return false; 11 return true; 12 } 13 int main() { 14 int m,n,p=0,count=0; 15 vector<int> num; 16 cin>>m>>n; 17 if(m==1){ 18 num.push_back(2); 19 count=1; 20 } 21 else { 22 count=1; 23 for(int i=3;i>0;i+=2){ 24 if(isprime(i)) count++; 25 if(count==m){ 26 num.push_back(i); 27 break; 28 } 29 } 30 } 31 if(num[0]==2){ 32 for(int i=3;count<n;i+=2){ 33 if(isprime(i)){ 34 num.push_back(i); 35 count++; 36 } 37 } 38 } 39 else{ 40 for(int i=num[0]+2;count<n;i+=2){ 41 if(isprime(i)){ 42 num.push_back(i); 43 count++; 44 } 45 } 46 } 47 int sub; 48 sub=n-m; 49 while(sub/10!=0){ 50 for(int i=0;i<10;i++){ 51 cout<<num[p]<<(i<9?" ":"\n"); 52 p++; 53 } 54 sub-=10; 55 } 56 for(int i=p;i<num.size();i++) 57 cout<<num[i]<<(i<num.size()-1?" ":"\n"); 58 system("pause"); 59 return 0; 60 }