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

Java中整数溢出

容宏逸
2023-03-14

我在一次采访中被问及这一点。我被要求计算数字x1,x2,x3,…的平均值,。。。xn公司

class Iterator {
    bool hasNext;
    int getNext();
}

//所以归结起来是这样的:

double average (Iterator & it) {

double average = 0;
double sum = 0;
int len = 0;

while (it.hasNext == true) {

    sum += it.getNext();
}

if (len > 0)
    average = sum / len;
}

面试官说列表的大小是未知的,它可能很大,所以总和可能会溢出。他问我如何解决溢出问题,我的回答是跟踪我们可能超过最大数量的次数等等,他说了一些关于推入堆栈、平均值和长度的事情,我从来没有真正理解他的解决方案,将这两个变量推入某种列表中?有人知道吗?

共有3个答案

蓟俊杰
2023-03-14

如果进一步简化rgettman公式,您将得到以下结果:

len++;
average = average + (it.next() - average) / len;
云何平
2023-03-14

他可能指的是这样一个事实:你不需要所有的术语来计算平均值,你可以跟踪移动平均值。这可以与迄今为止考虑得出的术语总数一起使用。

由于总数可能太大而无法存储很长时间,因此您希望使用Bigintger之类的东西来保存总数。

姚丰羽
2023-03-14

我不知道如何使用堆栈,但在代数的帮助下,我们可以使用旧的平均值推导出新平均值的公式。

假设您已经平均了n-1个项目,并且您在oldAvg中得到了该平均值。

oldAvg=(x1x2。xn-1)/(n-1)

新的平均值将由newAvg表示:

=(x1x2... xn-1xn)/n

通过一些代数运算,我们可以使用旧的平均数、平均项数和下一项来表示新的平均数。

新平均值=(x1x2。xn-1)/n xn

=((n-1)/(n-1))*(x1x2... xn-1)/n xn/n

=oldAvg/n*(n-1)xn/n

这可以通过在乘以n-1之前除以n来避免溢出。然后,只需添加下一项x除以n即可。

第一个循环将建立平均值等于第一个元素,但每个后续循环将使用上述公式来导出新的平均值。

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

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

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

  • 问题内容: 有了这段代码,我得到了这个答案。为什么我得到负值? 问题答案: 在您的平台上,np.arange返回dtype’int32’的数组: 数组的每个元素都是32位整数。平方导致结果不适合32位。结果被裁剪为32位,并且仍然解释为32位整数,这就是为什么看到负数的原因。 编辑: 在这种情况下,可以通过在平方之前构造dtype’int64’数组来避免整数溢出: 请注意,使用numpy时,发现的

  • 这是LeetCode中的Pascal三角形编码问题,它要求输出Pascal三角形的第n行。使用,输出如下所示: 显然存在溢出问题。现在为了解决这个问题,我修改了行< code > result . push _ back(result[I-1]*(rowIndex 1-I)/I);到< code > result . push _ back((double)result[I-1]*(double)

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