判定一個數是否爲素數(只能被1和本身整除)通常用小於這個數的所有數去試除他,看是否能被整除,顯然不夠簡便。
優化:
-
除了2以外,其他偶數全都不爲素數(能被2整除),所以除了2以外只需要判斷奇數是否爲素數
-
若要判斷一個數n,不需要試除到n-1或者n/2,只需要到sqrt(n),
因爲一個數若有因數,一個大於sqrt(n)一個小於sqrt(n)或者兩者都爲sqrt(n) -
一個數的獨特因數一定爲素數,可以將之前算出的素數保存,用於之後的判斷
(1.3優化平級)
代碼實現(只給出了函數,未寫主函數):
優化:1.2
用於判斷一個數是否爲素數
int isprime(int n)
{
int i = 0, end = sqrt(n);
if( n == 2)
return 1;
if(n % 2 == 0)
return 0;
for(i = 3; i <= end; i += 2)
{
if(n % i == 0)
return 0;
}
return 1;
}
優化:1.2.3
用於輸出n以內的所有素數
需要在順序遍歷,將每個找到的素數存到數組內
int arr[max]={2,3,5};
int func(int n)
{
int j, m = 3, i = 2, end;
for( ; ; )
{
m += 2; //2是素數,偶數都是非素數,奇數加2仍爲奇數
end = sqrt(m);
for(j = 1; arr[j] <= end; j++)
{
if(m % arr[j] == 0)
break;
}
if(end < arr[j])
{
arr[i++] = m;
}
if(fabs(m-n) <= 1)
break;
}
for(j = 0; j < i ; j++)
printf("%d ", arr[j]);
}