1. 程式人生 > >判斷一個正整數二進位制表示中1的個數/////////////質數判斷

判斷一個正整數二進位制表示中1的個數/////////////質數判斷

一、一個正整數二進位制表示中“1”個數 java程式碼實現

//演算法一----快速法
public Class Solution
{
    public int NumberOf1(int n)
    {
        int count=0;
        while(n!=0)
        {
            count++;
            n=n&(n-1);
        }
        return n;
    }
}

分析

這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。其原理是不斷清除n的二進位制表示中最右邊的1,同時累加計數器,直至n為0。

如果一個整數不為0,那麼這個整數至少有一個1;
把這個整數減去1,即把整數最右邊的一個1開始以及之後的所有位取反;
將整數與減1之後的整數相與操作,即實現把整數最右邊1變成0;
這樣,迴圈操作,整數的二進位制表示中有多少1,就迴圈多少次這個操作。

舉例

12->1100
從右邊數第三位是處於最右邊的1,減去1之後,第三位變為0,之後的兩位取反均由0變為1,而前面的第四位1保持不變,因此減去1之後變為1000,相與操作1100&1000=1000.繼續迴圈。。。

//演算法二----普通移位法
int BitCount(unsigned int n)
{
    unsigned int count
=0; while(n>0) { if((n&1)==1) ++count; n>>=1; } return c; }

二、判斷一個數是不是質數/素數

質數概念:
質數(prime number)又稱素數,有無限個。
質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數

public boolean isPrimeNumber(int num)
{
    if(num==1)
        return false;
    if(num==2)
        return
true; if(num%2==0)//大於2的偶數都不是質數 return false; for(int i=3;i<=Math.sqrt(num);i+=2) { if(num%i==0)//i=3,5,7,9,,,,等奇數,識別num是否被奇數整除 return false; } return true;//3,5,7進不去for迴圈,直接true. }

分析:
(1)”1”不是質數;
(2)偶數中只有“2”是質數;
(3)大於2的偶數都不是質數,因為它們除了1和自身之外還能被2整除;
(4)若是大於2的數,偶數都不是質數,則判斷大於2的奇數,將其開方,若從3到開方向下取整之間的所有奇數都不能將其整除,則說明不是合數,而是質數。
解釋:一個數如果是合數,那麼一定可以由兩個自然數相乘得到,比如18=3*6,而3