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;}
1013 數素數 (20)(20 分)