2道階乘的演算法題

2021-06-28 06:37:47 字數 1524 閱讀 2078

衝著51nod新ui去做了題,順便總結一下,這裡有2道階乘的題,

1003 階乘後面0的數量

n的階乘後面有多少個0?

6的階乘 = 1*2*3*4*5*6 = 720,720後面有1個0。

input

乙個數n(1 <= n <= 10^9)
output

輸出0的數量
input示例

5
output示例

1

看到這題第一反應就是,這該不會是有規律的把?

好吧,確實,問題就是,末尾的0是怎麼構成的,仔細想一下,還是能想出來,是5和其他偶數相乘得到的,這樣下去,是不是只要因子5的個數就好了?確實,因為從1~n的階乘中,凡是遇到5的倍數的,之前都有偶數,如下:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10 .....5n-1, 5n....n

5之前有偶數2和4,10之前有偶數6和8,這樣,每個5n之前都有偶數能夠跟它構成階乘末尾的乙個0,把這些5n抽出來,可以得到 5^k * k! (k = n/5) ,這樣,可以先得到k個5,然後再遞迴求k!中5的個數,就可以求出因子5的個數了,好了,上**:

#include using namespace std;

int main()

cout << ans;

return 0;

}

之前寫了個遞迴,過不了。,。。這樣就能ac了。

1008 n的階乘 mod p

輸入n和p(p為質數),求n! mod p = ? (mod 就是求模 %)

例如:n = 10, p = 11,10! = 3628800

3628800 % 11 = 10

input

兩個數n,p,中間用空格隔開。(n < 10000, p < 10^9)
output

輸出n! mod p的結果。
input示例

10 11
output示例

10

一看到這題,就在想階乘能否算出來,要是n等於9999的話,n!是非常大的,會溢位,用大數來模擬也很麻煩,醉了,好吧,上網搜了一下,取模運算是有規律的,其中,有一條規律是這樣的,

(a * b) % p = (a % p * b % p) % p

我想,這規律怎麼小學的時候沒看到。。。

好吧,通過這個規律,可以推出:

n! % p = ((n-1)!  % p) * n % p 

也就是說,在求n-1的階乘的時候,可以求模,然後儲存餘數,下一輪就可以用餘數來乘以n,然後求模,就求出n的階乘模p的結果了,**如下:

#include using namespace std;

int main()

cout << ans;

return 0;

}

這裡如果用int的話,是不能通過的。

講兩道常考的階乘演算法題

172.階乘後的零 793.階乘後k個零 1 輸入乙個非負整數n,請你計算階乘n 的結果末尾有幾個 0。比如說輸入n 5,演算法返回 1,因為5 120,末尾有乙個 0。函式簽名如下 int trailingzeroes int n 2 輸入乙個非負整數k,請你計算有多少個n,滿足n 的結果末尾恰好...

100 道演算法題

左程雲在牛客網上發帖子說過建議 80 備戰面試的時間放在資料結構和演算法上,剩下的 20 的時間再放在基礎知識上。cyc2018 在小專欄裡也說過 100 道 leetcode 會對面試幫助很大。雖然來來回回看了好些遍左程雲那個初級演算法課程,但是有的地方還是記不牢,準備面試的時間大部分還是花在了閱...

巧解一道階乘排序題

今天,介紹一道在本計算機考試書上的階乘排序 就是將乙個列表長度的階乘種的方式的排列組合輸出 題。下面我們直接看題 在1 49中任意選擇7個數,將這7個數的所有排列可能性全部輸出。例如 1,2,3 的所有輸出有 2,1,3 2,3,1 3,2,1 3,1,2 1,3,2 1,2,3 這道題的關鍵是要找...