poj1942

转自    点击打开链接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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值