@@@@请求高人指点@@@@
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7 输出:28
示例 2:
输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3 输出:28
示例 4:
输入:m = 3, n = 3 输出:6
提示:
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 109
代码如下
class Solution {
public:
int uniquePaths(int m, int n) {
//由于每行和每列都是确定的数字,所以我想到了排列组合这一方式,也得出了计算公式,但是由于要计算n,m都在一百以内,会导致整数溢出,无法解决
long long int sum,i,mi,ni;
long long int all=1,all_m=1,all_n=1;
if(n>m)
{
int t=m;//这里是为了使m成为最大值
m=n;
n=t;
}
for(i=1;i<=m+n-2;i++)
{ if(i<=m-1)
{ mi=i;
all=(i*all)/mi;//这里为了防止整数溢出,已经简化了一下,在便利all时候,直接把m除了,但不能同时除于n,当在较小数的时候,因为是int类型,不够除,会变为0。
}
else
all=all*i;//到这里还是溢出了
}
for(i=1;i<=n-1;i++)
{
all_n=all_n*i;
}
sum=all/all_n;
return sum;
}
};
如果说我想用排列组合,该如何更改代码,减小整数溢出风险