1. 程式人生 > >1013 數素數 (20)(20 分)

1013 數素數 (20)(20 分)

.cn 分析 eof pen item 要求 個數字 ref 整數

令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 分)