当前位置: 首页 > 知识库问答 >
问题:

整数溢出问题

程卓君
2023-03-14
vector<int> getRow(int rowIndex) {
vector<int> result;
if(rowIndex < 0)   return result;
if(rowIndex == 0){
    result.push_back(1);
    return result;
}
for(int i = 0; i < rowIndex+1; i++){
    if(i == 0)  result.push_back(1);
    else{
        result.push_back(result[i-1] * (rowIndex+1-i)/i);
    }
}
return result;
}
int main()
{
    vector<int> tmp = getRow(30);
    for(int i = 0; i < tmp.size(); i++){
        cout << tmp[i] << " ";   
    }
    cout << endl;
    return 0;
}

这是LeetCode中的Pascal三角形编码问题,它要求输出Pascal三角形的第n行。使用rowIndex=30,输出如下所示:

1 30 435 4060 27405 142506 593775 2035800 5852925 14307150 30045015 54627300 86493225 119759850 145422675 -131213633 -123012780 -101304642 -73164463 -46209134 -25415023 -12102391 -4950978 -1722079 -502273 -120545 -23181 -3434 -367 -25 0 

显然存在溢出问题。现在为了解决这个问题,我修改了行< code > result . push _ back(result[I-1]*(rowIndex 1-I)/I);到< code > result . push _ back((double)result[I-1]*(double)(rowIndex 1-I)/I);。它产生正确的输出:

1 30 435 4060 27405 142506 593775 2035800 5852925 14307150 30045015 54627300 86493225 119759850 145422675 155117520 145422675 119759850 86493225 54627300 30045015 14307150 5852925 2035800 593775 142506 27405 4060 435 30 1 

有人可以解释一下这里的问题到底是什么吗?我们知道有符号整数值的范围是 -2147483648 到 2147483647。如果不进行铸造,为什么在值155117520打印为溢出-131213633

共有1个答案

姬慎之
2023-03-14

一.表达方式

result[i-1] * (rowIndex+1-i)/i

乘法首先发生,并导致溢出:

result[i-1] * (rowIndex + 1-i)

然后结果除以< code>i,产生负输出。

顺便说一句,如果您决定强制转换,请避免强制转换为Double,因为可能存在舍入问题。您可以尝试long,但一开始使用可能更好。

vector<long>

或者甚至

vector<unsigned long>

或者,多亏了@WorldSEnder,

vector<unsigned long long>

尽管如此,请注意,该标准并不能保证longlong long长于int。它也不能保证int[-2147483648,2147483647]范围内。

 类似资料:
  • 虚拟机安装:Ubuntu 12.04(x86) 什么是整数溢出? 存储大于最大支持值的值称为整数溢出。整数溢出本身不会导致任意代码执行,但整数溢出可能会导致堆栈溢出或堆溢出,这可能导致任意代码执行。在这篇文章中,我将仅谈论整数溢出导致堆栈溢出,整数溢出导致堆溢出将在后面的单独的帖子中讨论。 数据类型大小及范围: 当我们试图存储一个大于最大支持值的值时,我们的值会被包装 。例如,当我们尝试将存储到带

  • 本文向大家介绍C#整数溢出,包括了C#整数溢出的使用技巧和注意事项,需要的朋友参考一下 示例 整数可以存储的最大容量。而当您超过该限制时,它将循环回到负面。对于int,它是2147483647 对于超出此范围的所有整数,请使用System.Numerics数据类型为BigInteger的名称空间。检查下面的链接以获取更多信息https://msdn.microsoft.com/zh-cn/libr

  • 我在一次采访中被问及这一点。我被要求计算数字x1,x2,x3,…的平均值,。。。xn公司 //所以归结起来是这样的: 面试官说列表的大小是未知的,它可能很大,所以总和可能会溢出。他问我如何解决溢出问题,我的回答是跟踪我们可能超过最大数量的次数等等,他说了一些关于推入堆栈、平均值和长度的事情,我从来没有真正理解他的解决方案,将这两个变量推入某种列表中?有人知道吗?

  • 我一直在考虑整数(int类型)溢出,我突然想到除法可能溢出。 示例:在我当前的平台上 因此 因此 因此 因此,除法 (INT_MIN / -1 ) 确实溢出。 因此,我有两个问题: > 可以编写哪些(跨平台)C代码来防止除法溢出(对于类型(有符号)int)? 什么保证(在C或C标准中)可能有助于设计代码? 例如,如果标准保证我们有 或者 然后出现以下代码来防止溢出。

  • 由于溢出,下面代码中的第一个for循环找不到正确的最大值。然而,第二个for循环确实如此。我用了门闩。com查看该程序的字节码,该程序显示,要确定哪个数字更大,第一个for循环使用isub,第二个for循环使用if_icmple。有道理。然而,为什么if_icmple能够成功地进行这种比较,因为它在某些时候也必须进行减法运算(我认为这会产生溢出)? 输出是 最大值为-2147483648

  • 我对编码和练习leetcode问题还不熟悉。整数反向问题涉及溢出。 我已经搜索并讨论了关于如何处理溢出的大部分内容。有人能解释一下溢出的原因吗?