一步一步寫演算法(之素數問題)

2021-06-02 06:15:04 字數 1238 閱讀 9674

問題描述

素數就是指在乙個大於1的自然數中,僅能被1和它自身整除的整數。判定乙個整數n是否為素數就是要判定整數n能否被除1和它自身之外的任意整數整除,若都不能整除,則n為素數。

這個演算法實現起來很簡單,主要目的是為了體會演算法時間複雜度,要時刻注意優化演算法,這在實際應用中非常重要。

問題解析

介面設計:判斷乙個整數(引數)是否為素數(質數),如果是質數,則返回1,否則返回0。

方法1:根據概念判斷。判定乙個整數n是否為素數就是要判定整數n能否被除1和它自身之外的任意整數整除,若都不能整除,則n為素數。時間複雜度o(n)。

int  isprimenumber(int n)

for(j=2;j方法2:減小問題規模。判定乙個整數n是否為素數,除了2以外的偶數肯定不是素數,因此可以跳過,只需判斷奇數是否為素數。這樣,判斷素數的外迴圈次數可以減少1/2。時間複雜度o(n/2), 速度提高一倍。

int isprimenumber(int n)

//驗證偶數

if( n==2 )

else if( n%2==0 )

//驗證奇數

for(j=3;j方法3:減小問題規模。判定乙個整數n是否為素數,不需要用偶數去測試,而且不需要測試到n,只需要測試到n的平方根就可以了,這樣內迴圈的次數又進一步減少了。時間複雜度o(sqrt(n)/2), 速度提高o((n-sqrt(n))/2)。

int isprimenumber(int n)

//驗證偶數,第一種形式

if( n==2 )

else if( n%2==0 )

//驗證偶數,第二種形式

/* if( n%2==0 )

return 0;

}*///驗證奇數,第一種形式

/* int k=int(sqrt(double(n)));

for(j=3;j<=k;j+=2) }

if(j>k)

else

*/ //驗證奇數,第二種形式

/* for(j=3;j*j<=n;j+=2) }

if(j*j>n)

else

*/ //驗證奇數,第三種形式

for(j=3;j*j<=n;j+=2) }

return 1;

}

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法 之 A 演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...