转自 点击打开链接http://blog.csdn.net/lyy289065406/article/details/6648516
题目大意:从给出的网格的左下角走到右上角,求出有多少种方法实现
思路:用到了组合数学的方法。给出n*m的网格,也就是必须有n个向右走的格子和m个 向上走的格子,加起来是(n+m)步。也就是,给定(m+n)个格子,向上和向 右的数目是一定的,则转化成在(m+n)个格子里面计算出有多少种m个格子各 不相同。
组合数学的基本公式:
由此 result=(n+m)! / ( m!*n!)
求result的过程:
1: 传统方法进行运算,则会造成超时
2: 最快速的方法是逐级相除,并且把各级所得的结果想乘,最终得到的是一个double 类型的数据(double类型的数据注意四舍五入)
代码如下:
解释:1: result=(n+m)!/ n!得到的数是从(n+1)开始到(n+m)相乘的结果,
存在n个数字相乘
2: 所以从(n+m)开始逐级相除,知道n逐减到0
解题代码如下:
#include<iostream>
#include<iomanip>
using namespace std;
unsigned a,b;
double Work()
{
unsigned d;
d=a+b;
a=a<b? a:b;
double c=1.0;
while(a>0)
c*=(double)(d--)/(double)(a--);
return c;
}
int main()
{
while(cin>>a>>b)
{
if(a==b&&b==0)
break;
cout<<fixed<<setprecision(0)<<Work()<<endl;
}
return 0;
}