編寫函式,引數是兩個非負整數n和m,返回組合數cnm=n!(m!(n-m)!),其中m<=n<=25,例如,n=25,m=12時答案為5200300。
很多人一看到這個題目,第一做法是編寫乙個計算階乘的函式,然後返回值。其做法如下
#include
long long factorial(int n){
long long m=1;
for(int i=1;i如果按這樣計算,要計算m的階乘和n的階乘,這樣很容易溢位,我們需要對現有的公式進行化簡之後再編寫**。
乙個簡單的方法是利用n!/m!=(m+1)(m+2)(m+3)......(n-1)n,這樣可以很大幅度的減少溢位可能。改良後的完整**如下
#include
long long c(int n,int m){
if(m這裡的函式c中有乙個技巧,if(m我們可以看到cnm=n!(m!(n-m)!),如果當m我們算一下c25 1的值,在25個東西裡面選出乙個東西的選法,很簡單,有25種選法。
如果我們按照原式執行函式,c25 1=25!/(1!*24!),我們要計算出2*3*4*5*......25的結果,然後再用這個結果除以1,除以2一直除到24為止。
如果我們把分母中兩個數換乙個位置,把較大的24換到前面來再執行一下函式c,再來看一下執行過程,函式會從m+1一直乘到n,此時m=n-m=24,也就是從25乘到25,結果為25,然後用這個結果除以1,除以2,一直除到n-m為止,但是此時的n-m就等於1,所以25除以1就等於最後的結果。輸出為25。
新手自學,純屬手打,不知道能不能幫助到不能理解這個小技巧的童鞋。
計算組合數
1.防溢位 如果直接用c n,m n!n m m 來程式設計很可能會在算n!時就爆了long long,所以每一步最好把除分母也算上。所以對於c n,m 來說取m min m,n m 來算c n,m n n 1 n 2 n m 1 m m 1 m 2 1 顯然分子分母都是m項相乘,從後往前去算 先算...
計算組合數
計算組合數 time limit 1000ms memory limit 32768kb submit statistic problem description 計算組合數。c n,m 表示從n個數中選擇m個的組合數。計算公式如下 若 m 0,c n,m 1 否則,若 n 1,c n,m 1 否則...
計算組合數
time limit 1000 ms memory limit 32768 kib problem description 計算組合數。c n,m 表示從n個數中選擇m個的組合數。計算公式如下 若 m 0,c n,m 1 否則,若 n 1,c n,m 1 否則,若m n,c n,m 1 否則 c n...