标签:题意 sign 地方 while clu nbsp div 负数 形参
题目链接: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\n",getc(n,m)); 19 return 0; 20 }
标签:题意 sign 地方 while clu nbsp div 负数 形参
原文地址:https://www.cnblogs.com/FrankChen831X/p/10688953.html