1013 数素数 (20)(20 分)
令P~i~表示第i个素数。现任给两个正整数M <= N <= 10^4^,请输出P~M~到P~N~的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从P~M~到P~N~的所有素数,每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
分析: 题目要求的是打出前10000个素数, 那么是否可以估算出最后一个素数是多大?
根据素数分布公式, 1~x范围内的素数个数大概是x/ln(x), 将x=100000, 200000逐一带入,
可以发现200000符合要求.
代码为:
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> // sqrt 4 #include <cstring> // memset 5 #include <vector> 6 #include <iostream> 7 using namespace std; 8 9 #define range 200000 10 bool isPrime[range+5]; 11 12 int main() 13 { 14 //freopen("input.txt", "r", stdin); 15 memset(isPrime, 1, (range+5)*sizeof(bool)); 16 17 int sqrt_of_range = sqrt(range); 18 for(int i=2;i<=sqrt_of_range;i++) 19 if(isPrime[i]) 20 for(int j=i*i;j<=range;j+=i) 21 isPrime[j] = 0; 22 vector<int> primes; 23 primes.push_back(1); 24 for(int i=2;i<range;i++) 25 if(isPrime[i]) 26 primes.push_back(i); 27 28 int M, N; 29 cin>>M>>N; 30 for(int i=0;i<N-M+1;i++) 31 { 32 cout<<primes[i+M]; 33 if(i!=N-M) 34 { 35 if(i%10 == 9) 36 cout<<endl; 37 else 38 cout<<' '; 39 } 40 } 41 return 0; 42 }
#include <cstdio>#include <cstdlib> #include <cmath> // sqrt#include <cstring> // memset#include <vector>#include <iostream>using namespace std;
#define range 200000bool isPrime[range+5];
int main(){//freopen("input.txt", "r", stdin);memset(isPrime, 1, (range+5)*sizeof(bool));int sqrt_of_range = sqrt(range);for(int i=2;i<=sqrt_of_range;i++)if(isPrime[i])for(int j=i*i;j<=range;j+=i)isPrime[j] = 0;vector<int> primes;primes.push_back(1);for(int i=2;i<range;i++)if(isPrime[i])primes.push_back(i);int M, N;cin>>M>>N;for(int i=0;i<N-M+1;i++){cout<<primes[i+M];if(i!=N-M){if(i%10 == 9)cout<<endl;elsecout<<' ';}}return 0;}