int uniquePaths(int m, int n) {
int num = m+n-2;
int den=1;
double ans = 1;
while(den<=m-1) {
ans = ans*(num--)/(den++);
}
cout<<ans;
return (int)ans;
}
Run Code Online (Sandbox Code Playgroud)
作为上述代码段的输入,m=53, n=4 的预期答案是 26235,但代码返回 26234。但是,标准输出显示 26235。
您能帮我理解这种行为吗?
由于浮点舍入,您的代码计算ans结果为 26,234.999999999985448084771633148193359375。当使用 打印时cout<<ans,默认格式不显示完整值,并将其舍入为 \xe2\x80\x9c26235\xe2\x80\x9d。然而,当实际值转换为 时int,结果是 26,234。
设置为后num,m+n-2您的代码正在计算num!/ (( m-1)!( num-m+1)!),当然等于num! / (( num-m+1)!( m-1)!)。因此,您可以使用m-1或num-m+1作为限制。因此,您可以将该while行更改为这两行:
int limit = m-1 < num-m+1 ? m-1 : num-m+1;\n while(den<=limit) {\nRun Code Online (Sandbox Code Playgroud)\n然后你的代码将运行到下限,这将避免除以ans尚未包含在内的因素。所有结果都将是精确的整数结果,没有舍入错误,除非您尝试计算的结果超出了double能够表示所有整数的格式范围(在普遍存在的 IEEE-754 二进制 64 格式中最多为 2 53double ) )。
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |