一、基本思想
//質數(素數)是指在大於1的自然數中除了1和它本身以外不再有其他因數的自然數。
(1)判斷一個數n是不是素數,可以用2到(int)sqrt(n)之間的所有整數去除n,看能否整除,如果都不能整除,那麼n是素數(慢)
(2)窮舉法優化就是減少了不必要的窮舉
(3)篩法求素數:把2到n的多有數都存到數組裏,從2開始,先劃掉n內所有2的倍數,然後每次從下一個剩下的數(必然是素數)開始,劃掉其n內所有的倍數,最後剩下的數,就都是素數。
具體到程序:
1.可以設置一個標記數組isPrime,isPrime[i]的值是1,就表示是素數;
2.劃掉k的倍數,就是把isPrime[2*k],isPrime[3*k]...置成0;
3.最後檢查isPrime數組,輸出isPrime[i]爲1的那些i。
這種方法:空間換時間,加快了速度,對於大量數的計算效果尤爲明顯
以下爲兩種方法的程序:
#include<stdio.h>
#include<math.h>
//質數(素數)是指在大於1的自然數中
//除了1和它本身以外不再有其他因數的自然數。
int IsPrime(int m){//普通方法求素數
int sq,i;
sq=(int)sqrt(m);//注意取整
for(i=2;i<=sq;i++){//注意i<sq錯誤
if(m%i==0){
return 0;
}
}
return 1;
}
int main(void){
int m,j;
scanf("%d",&m);
if(IsPrime(m)){
printf("Yes,it is prime\n");
}
else{
printf("No!\n");
}
for(j=2;j<=100;j++){
if(IsPrime(j))
printf("%4d",j);
}
return 0;
}
#include<math.h>
#include<stdio.h>
int main(){//優化窮舉法求100以內的全部素數
int i,sq;
printf("%3d",2);//2是素數
for(i=3;i<=100;i+=2){//每次判讀i是否爲素數
int k;//偶數一定不是素數故跳過
sq=(int)sqrt(i);
for(k=3;k<=sq;k+=2){//不檢查是否能被偶數整除
if(i%k==0){//如果不是素數,跳出本循環體
break;
}
}
if(k>sq)//如果k>sq,說明檢查完所有數,都沒有被整除
printf("%3d",i);
}
return 0;
}
#include<stdio.h>//篩選法求素數
#define MAX_NUM 100
char isPrime[MAX_NUM+10];//避免數組越界?
//最終如果isPrime[i]爲1,表示i是素數
int main(void){
int i,j;
for(i=2;i<=MAX_NUM;++i)//假設所有的數都是素數
isPrime[i]=1;
for(i=2;i<=MAX_NUM;++i){
if(isPrime[i])//避免重複去掉數,只標記素數的倍數
for(j=2*i;j<=MAX_NUM;j+=i){
isPrime[j]=0;//將素數的倍數標記爲非素數
}
}
for(i=2;i<=MAX_NUM;++i)
if(isPrime[i])
printf("%-3d",i);
return 0;
}