【算法】試除法求素數

判定一個數是否爲素數(只能被1和本身整除)通常用小於這個數的所有數去試除他,看是否能被整除,顯然不夠簡便。

優化:
  1. 除了2以外,其他偶數全都不爲素數(能被2整除),所以除了2以外只需要判斷奇數是否爲素數

  2. 若要判斷一個數n,不需要試除到n-1或者n/2,只需要到sqrt(n),
    因爲一個數若有因數,一個大於sqrt(n)一個小於sqrt(n)或者兩者都爲sqrt(n)

  3. 一個數的獨特因數一定爲素數,可以將之前算出的素數保存,用於之後的判斷

(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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章