1. 程式人生 > >c語言實現求組合數(帶點優化的思想,防止溢位)

c語言實現求組合數(帶點優化的思想,防止溢位)


這是大家都知道的組合數,思想也很簡單,但是裡面的階乘,容易溢位,讓m!/n!先約分,減小數的大小,m!/n! = (n+1)(n+2)(n+3)···(m-1)(m);

如果m-n > n的話,我們就讓n = m-n.j儘可能讓乘起來的數小一點。程式碼列印的是25裡面選12個的組合數 5200300.

#include <stdio.h>

long long factorial(int m, int n)
{
	long long ans = 1;
	if(m < n-m) m = n-m;
	for(int i = m+1; i <= n; i++) ans *= i;
	for(int j = 1; j <= n - m; j++) ans /= j;
	return ans;
	  
}

int main()
{
	int m, n;
	long long count = 0;
	scanf("%d %d", &m, &n);
	count = factorial(m, n);
	printf("%I64d", count);
}