加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中的整数溢出

发布时间:2020-12-15 04:19:46 所属栏目:Java 来源:网络整理
导读:我在接受采访时被问到这个问题. 我被要求计算数字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 ==
我在接受采访时被问到这个问题.
我被要求计算数字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;
}

采访者说清单大小不明,而且可能非常大,所以总和可能会溢出.他问我如何解决溢出问题,我通过跟踪我们如何超过最大数量等来回答,他说了一些关于推入堆栈的事情,平均值和长度,我从来没有真正理解他的解决方案通过推动这些2变量成某种列表?有人有线索吗?

解决方法

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

假设您已经平均了n – 1个项目,并且您在oldAvg中有平均值.

oldAvg =(x1 x2 .. xn – 1)/(n – 1)

新的平均值将由newAvg表示:

newAvg =(x1 x2 .. xn – 1 xn)/ n

通过一些代数操作,我们可以使用旧平均值表示平均值的新平均值,以及下一个项目.

newAvg =(x1 x2 .. xn – 1)/ n xn / n

=((n – 1)/(n – 1))*(x1 x2 .. xn – 1)/ n xn / n

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

这可以通过在乘以n-1之前除以n来避免溢出.然后,您只需要添加下一个项xn,除以n.

第一个循环将平均值设置为等于第一个元素,但每个后续循环将使用上面的公式来推导新的平均值.

n++;
newAvg = oldAvg / n * (n - 1) + it.next() / n;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读