判斷一個正整數二進位制表示中1的個數/////////////質數判斷
阿新 • • 發佈:2018-12-26
一、一個正整數二進位制表示中“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