![](/img/trans.png)
[英]Multiplication of 3 long long numbers gives different answers in C++ and Python
[英]Why the algorithm gives different answers for C++ and Python?
我今天做了一个算法练习。 这个问题的教程给出了一个用 C++ 编写的示例答案:
int dp[21][200];
int i, j, k;
void main()
{
int bucketN, fishN;
scanf("%d %d", &bucketN, &fishN);
dp[0][0] = 1;
for(int i = 1; i <= bucketN; ++i)
{
for(int j = 0; j <= fishN; ++j)
{
for(int k = 0; k <= 10 && j-k >= 0; ++k)
{
dp[i][j] += dp[i-1][j-k];
}
}
}
printf("%d\n",dp[bucketN][fishN]);
}
如果bucketN
和fishN
都是20,则输出将为65649764
。
我将 C++ 实现翻译成 Python,我的代码如下所示。
import numpy as np
arr = np.zeros((21, 200))
def main(bucket, fish):
b, f = bucket, fish
arr[0, 0] = 1
for i in range(1, b+1):
for j in range(f+1):
for k in range(11):
if j-k < 0:
break
else:
arr[i, j] += arr[i-1, j-k]
print(arr[b, f])
return arr[b, f]
if __name__ == '__main__':
main(20, 20)
bucket
和fish
仍然是 20,但输出是68785126410.0
。
我感到很困惑,我认为我的代码与原始 C++ 代码相同。 希望有C++或Python高手能解释一下。
在 C++ 代码中, dp
数组的数据类型是 int,最多可以容纳数字 2147483647。您正在寻找的真正非溢出答案由您的 Python 代码 68785126410 返回。将 C++ 代码中的第一行更改为: int dp[21][200];
到long long int dp[21][200];
以及从"%d
到%lld
的 printf 格式说明符,以查看 C++ 和 Python 中匹配(和正确)的答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.