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 == 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Java instanceof与类名
- 解析Java编程之Synchronized锁住的对象
- META-INF directory
- 在Java 9上的多版本JAR文件中调用了错误的类?
- JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原
- Java – 应该通过getter和setters方法在构造函数中访问私有
- java.text.SimpleDateFormat中的奇怪的行为,期望yyyyMMdd给
- 为什么“L”被添加到我的Java路径?
- java – E / MotionRecognitionManager:mSContextService导
- java – Hibernate,liquibase和hsqldb的Id生成问题