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