C USACO3 2 階乘問題

2021-10-19 04:15:55 字數 869 閱讀 6203

題目描述

也許你早就知道階乘的含義,n階乘是由1到n相乘而產生,如:

12!= 1×2×3×4×5×6×7×8×9×10×11×12=479,001,600

12的階乘最右邊的非零位為6。

寫乙個程式,計算n(1≤n≤50,000,000)階乘的最右邊的非零位的值。

注意:10,000,000!有2499999個零。

輸入格式

僅一行包含乙個正整數n。

輸出格式

乙個整數,表示最右邊的非零位的值。

輸入輸出樣例

輸入 #1複製

12輸出 #1複製

6演算法:

暴力 暴力乘,每次保留得到的數的後7位左右(保證不出現誤差)

如果每次 mod 10,會造成誤差.因為當相乘後得到的是10的倍數時,mod 10 會變成0.所以每次大概mod 1000000.最後輸出ans%10

原理:最後一位相乘只會影響最後一位.故只保留最後幾位就行了

數學方法:有兩種.第一種分析10怎麼出現.發現如果兩個數的因數中分別有2,5.那麼相乘末尾一定有0.於是統計1~n中每個數的因數中2和5的個數.用2的個數減去5的個數(2的個數一定比5的個數多).剩下的是會對答案(即末尾的數)造成影響.之後大膽mod 10 就行了.

第二種應該是正解.

分析:n!的末尾只會是2,4,6,8(在此題中沒有0).又[2,4,6,8]中任意乙個數乘6,末尾仍是本身.2 * 6 = 12,末尾為2, 4 * 6 =24,末尾為4, 6 * 6=36,末尾為6,8 * 6 =48,末尾為8.又末尾數字只受末尾數字影響,如4. 4 * 6得到的末尾數字與4 * 16的末尾數字一樣.又4 * 10=40,末尾數字為4(此題不要末尾0).則4 * 2 *8==4

P1134 USACO3 2 階乘問題

注意理解 今天做pta也遇到了乙個類似的題目,不過那個題目是讓求非0後k位。這裡,我們先把有可能乘出來10的質因子2和質因子5全部除掉,然後就可以放心大膽的取模啦,最後由於質因子2被多除了,再乘回來就好啦。include include include include include define ...

洛谷 P1134 USACO3 2 階乘問題

也就是字面上的意思,求出n!階乘的最右邊的非零位的值。用模擬加數論的方法,因為想要在末尾出現乙個0,那麼就一定會是10的倍數,而10 2 5,所以只要看1 n 現5的次數即可,因為2的倍數的數量一定是比5的倍數的數量多的。然後在循換中每次mod10求個位數,因為任何正整數相乘的個位數只與它們的個位數...

大數階乘問題

由於大數的階乘已經超過整型所能夠表示的最大值,屬於大數操作問題,需要採用字串進行操作。本文對n進行階乘求取,分解為兩個函式 void multiply char s1,char s2,char out 計算兩個字串的乘積,結果存入字串void calcnn int n,char pout 計算n的階...