程式設計之美中有關階層的演算法

2021-06-21 15:03:29 字數 636 閱讀 7912

①給定乙個整數,求n!末尾有多少個0

思路:假如想把n!算出來之後再對其求末尾0的個數只有在n比較小的時候才能行得通。換種思路,任何乙個大於1的正整數都可以唯一的寫為兩個或者多個素數的乘積,其中素數因子以非遞減的順序出現。舉個例子,比如100 = 2*2*5*5 = 2的平方乘以5的平方 ,那n!同樣可以表示成這種形式,如果n!的末尾有0,那n!的因子裡至少包含乙個2和1個5,現在求末尾有多少個0就變成求因子2的個數和因子5的個數,兩者中的最小值即為末尾0的個數。而因子2的個數必然是多於因子5的個數的,這樣就變成了求因子5的個數,那怎麼去求n!中因子5的個數呢?從1迴圈到n,然後依次去求每個數中5的個數顯然效率太低,可以用z=[n/5]+[n/25]+[n/125]....... ,其中n/5表示5的倍數都貢獻了1個5,[n/25]表示5的平方又貢獻了1個5 。

ret = 0;

while(n)

②求n!的二進位制表示中最低位1的位置,比如n=3,n!=6 ,表示為1010,即最低位的1在第二位

思路:假如乙個n!的二進位制表示為1010000000,這是我隨便寫的乙個數,那這個數可以除7次2,除完之後為101,這時候已經不能再被2整除了,現在就可以知道怎麼解這道題了,其實就是求因子2的個數,程式類似上一題。

《程式設計之美》中n n 1 的妙用

按位與 n n 1 作用 將n的二進位制表示中的最低位為1的改為0,先看乙個簡單的例子 n 10101 二進位制 則 n 1 10100 n n 1 10100 可以看到原本最低位為1的那位變為0。1 判斷乙個數是否是2的方冪 解釋 n n 1 0 如果a b 0,表示a與b的二進位制形式沒有在同乙...

C 正規表示式程式設計(一) C 中有關正則的類

正規表示式是一門靈活性非常強的語言,匹配同樣的字串可能在不同的開發人員那裡會得到不同的結果,在平常的時候也是用的時候看看相關資料,不用的時候就丟在腦後了,儘管在處理大部分情況下都能迅速處理,但是處理一些複雜的情況效率仍是不高,藉著前陣子做過的乙個專案涉及到正規表示式的機會,將有關資料閱讀了一遍並結合...

C 正規表示式程式設計(一) C 中有關正則的類

正規表示式是一門靈活性非常強的語言,匹配同樣的字串可能在不同的開發人員那裡會得到不同的結果,在平常的時候也是用的時候看看相關資料,不用的時候就丟在腦後了,儘管在處理大部分情況下都能迅速處理,但是處理一些複雜的情況效率仍是不高,藉著前陣子做過的乙個專案涉及到正規表示式的機會,將有關資料閱讀了一遍並結合...