1. 程式人生 > >素數相關【轉】

素數相關【轉】

size mos bool 一個數 style ring gif prime ||

1-n之間有多少個素數

10的1次方 4
10的2次方 25
10的3次方 168
10的4次方 1229
10的5次方 9592
10的6次方 78498
10的7次方 664579
10的8次方 5761455
10的9次方 50847534

1、單獨判斷一個數是否為素數

技術分享
1 bool prime(int n)  
2 {  
3     if(n==0||n==1) return false;  
4     if(n==2) return true;  
5     for(int i=2;i<=sqrt(n);i++)  
6 if(n%i==0) 7 return false; 8 return true; 9 }
單獨判斷一個數是否為素數

2、篩法篩素數 ,求小於maxn的素數

isprime[ ] 保存小於maxn的數是否為素數,false表示不是素數,true表示素數

prime[ ] 保存小於maxn的素數有哪些,從0開始,長度為len

技術分享
 1 const int maxn=100;  
 2 bool isprime[maxn];  
 3 int prime[maxn];  
 4 int len=0;  
 5   
 6 void sieve(int
n) 7 { 8 for(int i=0;i<n;i++) 9 isprime[i]=1; 10 isprime[0]=isprime[1]=0; 11 for(int i=2;i<n;i++) 12 if(isprime[i]) 13 { 14 prime[len++]=i; 15 for(int j=2*i;j<n;j+=i) 16 isprime[j]=0; 17 }
18 } 19 //主函數調用sieve(maxn)
篩法求素數

3、如果只要求小於maxn的素數有哪些,去掉isprime[ ]數組

下面模板中 prime[ ] 中保存的是maxn中的素數有哪些,標號從1開始,總的素數個數為prime[0] ,它包含的素數範圍為 prime[1]到prime[ prime[0] ]

技術分享
 1 const int maxn=100;  
 2 int prime[maxn+1];  
 3   
 4 void getPrime()  
 5 {  
 6     memset(prime,0,sizeof(prime));//一開始prime都設為0代表都是素數(反向思考)  
 7     for(int i=2;i<=maxn;i++)  
 8     {  
 9         if(!prime[i])  
10             prime[++prime[0]]=i;  
11         for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)  
12         {  
13             prime[prime[j]*i]=1;//prime[k]=1;k不是素數  
14             if(i%prime[j]==0)  
15                 break;  
16         }  
17     }  
18 }  
rt

4、大區間篩素數

POJ:2689

給出一個區間[L,R], 範圍為1<=L< R<=2147483647,區間長度長度不超過1000000

求距離最近和最遠的兩個素數(也就是相鄰的差最小和最大的素數)

篩兩次,第一次篩出1到1000000的素數,因為1000000^2已經超出int範圍,這樣的素數足夠了。

函數getPrim(); prime[ ] 存第一次篩出的素數,總個數為prime[0]

第二次利用已經篩出的素數去篩L,R之間的素數

函數getPrime2(); isprime[] 判斷該數是否為素數 prime2[ ]篩出的素數有哪些,一共有prime2[0]個

模板:

技術分享
 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int maxn=1e6;
 9 int prime[maxn+10];
10 
11 void getPrime()
12 {
13     memset(prime,0,sizeof(prime));//一開始prime都設為0代表都是素數(反向思考)
14     for(int i=2;i<=maxn;i++)
15     {
16         if(!prime[i])
17             prime[++prime[0]]=i;
18         for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
19         {
20             prime[prime[j]*i]=1;//prime[k]=1;k不是素數
21             if(i%prime[j]==0)
22                 break;
23         }
24     }
25 }
26 
27 bool isprime[maxn+10];
28 int prime2[maxn+10];
29 
30 void getPrime2(int L,int R)
31 {
32     memset(isprime,1,sizeof(isprime));
33     //isprime[0]=isprime[1]=0;//這句話不能加,考慮到左區間為2的時候,加上這一句,素數2,3會被判成合數
34     if(L<2) L=2;
35     for(int i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++)
36     {
37         int s=L/prime[i]+(L%prime[i]>0);//計算第一個比L大且能被prime[i]整除的數是prime[i]的幾倍,從此處開始篩
38         if(s==1)//很特殊,如果從1開始篩的話,那麽2會被篩成非素數
39             s=2;
40         for(int j=s;(long long)j*prime[i]<=R;j++)
41             if((long long)j*prime[i]>=L)
42             isprime[j*prime[i]-L]=false; //區間映射 ,比如區間長度為4的區間[4,7],映射到[0,3]中,因為題目範圍2,147,483,647數組開不出來
43     }
44     prime2[0]=0;
45     for(int i=0;i<=R-L;i++)
46         if(isprime[i])
47         prime2[++prime2[0]]=i+L;
48 }
49 
50 int main()
51 {
52     getPrime();
53     int L,R;
54     while(scanf("%d%d",&L,&R)!=EOF)
55     {
56         getPrime2(L,R);
57         if(prime2[0]<2)
58             printf("There are no adjacent primes.\n");
59         else
60         {
61             //for(int i=1;i<=prime2[0];i++)
62                // cout<<prime2[i]<<endl;
63             int x1=0,x2=1000000,y1=0,y2=0;
64             for(int i=1;i<prime2[0];i++)
65             {
66                 if(prime2[i+1]-prime2[i]<x2-x1)
67                 {
68                     x1=prime2[i];
69                     x2=prime2[i+1];
70                 }
71                 if(prime2[i+1]-prime2[i]>y2-y1)
72                 {
73                     y1=prime2[i];
74                     y2=prime2[i+1];
75                 }
76             }
77             printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2);
78         }
79     }
80     return 0;
81 }
View Code

素數相關【轉】