poj1942(求组合数)

题目链接:http://poj.org/problem?id=1942

题意:实际上这道题就是求C(n+m,n)。

思路:n、m的范围在unsigned中,所以不能递推计算组合数,可以采用公式C(a,b)=a!/(b!*(a-b)!),并且拆分阶乘依次进行除法运算。我在一个地方TLE了半小时,开始怎么也想不通怎么会T,后来发现我的getc函数的形参传递的是int,这样一旦实参是int所不能表示时,传递过来的可能是负数,那么在while循环里就会出现死循环,所以就T了。写代码真的要细心一些啊QAQ。还有一个细节是输入可能出现X 0 (X>0),应该输出1,而不是结束。

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 unsigned n,m;
 6 
 7 unsigned getc(unsigned x,unsigned y){
 8     unsigned a=x+y,b=min(x,y);
 9     double ans=1.0;
10     while(b>0)
11         ans*=(double)(a--)/(double)(b--);
12     ans+=0.5;
13     return (unsigned)ans;
14 }
15 
16 int main(){
17     while(~scanf("%u%u",&n,&m),n||m)
18         printf("%u
",getc(n,m));
19     return 0;
20 }
原文地址:https://www.cnblogs.com/FrankChen831X/p/10688953.html