編程之美----不要被階乘嚇到


任一個正整數都能分解成質數的連乘,因此求N!末尾有多少個0,等於質因數分解之后5的個數,而求5的個數可以用如下代碼實現:

ret =0;
while(N)
{
    ret += N/5;
    N/=5;
}
View Code

5的倍數貢獻一個5,5的平方的倍數再貢獻一個5,如此繼續下去。。。。

問題二:求N!的二進制表示中最低位1的位置,等價於求N! 含有質因數2的個數加1,因為如果將N!表示成2的多少次冪乘以一個數,那么就可以表示成2的多少次冪+2的更多的次冪。於是將上面的代碼稍微修改就可以用來求此問題,另外N!含有質因數2的個數,還等於N減去N的二進制表示中1的數目。假如N=11011,這些0,1都代表二進制,那么

1101(這里可以理解為N/2)+110(N/4)+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的個數)。

 

相關題目:

給定整數n,判斷它是否為2的方冪。可用(n>0&&((n&(n-1))==0)求解


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com