博主簡單的寫下這篇文章,主要爲了更好地複習和理解,希望對各位有幫助。
素數:指一個只能被1和它本身整除的數。
青銅級別求素數:枚舉範圍內的每個數在2到本身的範圍中是否有被整除的數。沒有就是素數,有就不是素數。
int IsPrime(int n){
int i;
if(n <= 1) return 0;
if(n==2) return 1;
for(i = 2;i < n;i++) if(n%i==0) return 0;
return 1;
}
白銀級別求素數:此法與第一種差不多,唯一變化就是枚舉是否有被整除的數的範圍。由於2*4=8與4*2=8是一樣的,減少重複,提高程序效率。
int IsPrime(int n){
int i;
if(n <= 1) return 0;
if(n==2) return 1;
for(i=2;i<=n/2;i++) if(n%i==0) return 0;
return 1;
}
黃金級別求素數:由於所有素數(除了2)都是從奇數中出現。所以我們可以先去掉偶數,再篩選,這樣的效率就會更高一點
int IsPrime(int n){
int i;
if(n==2) return 1;
if(n<=1||n%2==0) return 0;
for(i=3;i<=n/2;i+=2)if(n%i==0) return 0;
return 1;
}
鉑金級別求素數:求素數方法同上一種,在範圍內找素數,去掉此範圍中的偶數。如for(int i=3;i<=1000;i+=2),找1000以內的素數
鑽石級別求素數:
int IsPrime(int n){
int i;
if(n%2==0) return 0;
for(i = 3;i <= sqrt(n);i+=2) if(n%i==0) return 0;
return 1;
}
星耀級別求素數:標記範圍內所有數,然後判斷
1)去掉2的倍數;2)去掉3的倍數;3)去掉4的倍數(不需要,第一步已經去掉了)....直到不能去掉爲止。
void IsPrime(int n){
int i,j;
for(i=2;i<=n;i++) prime[i]=1;
for(i=2;i<=n;i++){
if(prime[i]) printf(" %d ",i);
for(j=i+i;j<=n;j+=i) prime[j] = 0;
}
}
王者求素數:
1)定義一個數組a去存儲素數。然後不斷去標記範圍內不是素數的數(也就是素數的倍數a[j]*i)。
2)i%a[j]==0,使任一個合數,只能被它的最小質因數(18=2*3*3,最小質因數爲2)標記一次。因爲一遇到最小質因數a[j]就跳出。
void IsPrime(int n){
int i,j,len=0;
for(i=0;i<n;i++) prime[i]=1;///初始化prime
for(i=2;i<=n;i++){
if(prime[i]) {
a[len++]=i;
printf("%d ",i);
}
for(j=0;j<len&&a[j]*i<=n;j++) {
prime[a[j]*i]=0;
if(i%a[j]==0) break;
}
}
}
以上就是求素數的幾種方法,一般來說,我們都是選最後兩種方法。