對于階乘是個很有意思的函數,給定一個整數,那么它的階乘是多少那?而它末尾有多少個0,
對于這個問題,是不是要直接計算N!?如果溢出怎么辦,我們如何快速的找到該題的結果?首先要思考的N!= M*10^E。在N之前你需要看看那幾個的成績滿足即可,比如2*5=10,所有2和5乘積就可以得到一個10,于是由于能被2整除的整數的頻率要高于能被5整除的,所以我們可以取5考即可。
方法一從1開始到N,算出符合要求的個數。int result=0;
for(i = 1;i<=N;i++)
{
j = i;
while(j%5 == 0)
{
result++;
j/5;
}
}
或者是while(N)
{
result+=N/5;
N/=5;
}
類似可以求解二進制的問題,比如求N!的二進制中最低位1的位置。
由于N!中含有質數2的個數。等于N/2+N/4+N/8....1.
int lowOfone(int n)
{
int result = 0;
while (n)
{
n>>=1;
result+=n;
}
return result;
}
對于
給定整數n,判斷它是否為2的方冪(解答提示:n>0&&((n&(n-1))==0))。
轉載:
【N!二進制的解法二】
N!含有質因數2的個數,還等于N減去N的二進制表示中1的數目。我們還可以通過這個規律來求解。
下面對這個規律進行舉例說明,假設 N = 11011,那么N!中含有質因數2的個數為 N/2 + N/4 + N/8 + N/16 + …
即: 1101 + 110 + 11 + 1
=(1000 + 100 + 1)
+(100 + 10)
+(10 + 1)
+ 1
=(1000 + 100+ 10 + 1)+(100 + 10 + 1)+ 1
= 1111 + 111 + 1
=(10000 -1)+(1000 - 1)+(10-1)+(1-1)
= 11011-N二進制表示中1的個數
小結
任意一個長度為m的二進制數N可以表示為N = b[1] + b[2] * 2 + b[3] * 22 + … + b[m] * 2(m-1),其中b [ i ]表示此二進制數第i位上的數字(1或0)。所以,若最低位b[1]為1,則說明N為奇數;反之為偶數,將其除以2,即等于將整個二進制數向低位移一位。
posted on 2011-09-29 13:51
mengkai 閱讀(531)
評論(0) 編輯 收藏 引用 所屬分類:
algorithm