【问题标题】:Getting arithmetic average with numbers less than Integer min value? [duplicate]获得数字小于整数最小值的算术平均值? [复制]
【发布时间】:2016-03-06 18:44:35
【问题描述】:

我有这个任务,我需要找到 2 个整数的平均值。 这是我的代码:

public class AverageNumber {
  public int average(int a, int b) {
    if (a == Integer.MIN_VALUE && b == Integer.MIN_VALUE) {
      return Integer.MIN_VALUE;
    } else if (a < 0 || b < 0) {
      return (a + b)/2;
    } 
    return (a+b)>>>1;
  }
}`

我在这次测试中失败了:

Input: -2147483648, -2
Expected: -1073741825
Actual: "1073741823"

我需要一些帮助来处理超出范围 = Integer.MIN_VALUE 的数字。而且我不能使用长类型。

【问题讨论】:

  • 当您的数据(以及依赖于它的计算)无法放入提供给您的存储空间(这里就是这种情况)时,您需要编写或使用(许多免费提供的)“大数字”图书馆。鉴于您对我不能使用长类型 的陈述,我希望您在一个班级中,您应该为此形成自己的有限大数函数。堆栈溢出不会为您编写代码,但如果您尝试编写自己的代码并遇到麻烦,您可能会在发布自己为解决问题所采取的代码和努力后获得帮助。
  • 这是作业吗?你只能使用ints 进行计算?
  • 实际上,鉴于您在此处尝试执行的操作范围有限,因此不需要复杂的库。虽然我们认为执行平均的正常方法是将两个值相加并将结果除以 2,但这是行不通的,因为您无法安全地将两个输入相加。在不透露太多内容的情况下,您可以重写公式,这样您就不必添加两个会溢出 int 的值。

标签: java c++ average


【解决方案1】:

听起来像家庭作业 :-) 这更像是一道数学题,而不是一道编程题。

计算两者之间的差,并将差的一半加到“较小”的数字上。你必须更详细地解释负数,但这样你就不会“溢出”一个 int。

【讨论】:

  • 差异仍然可以溢出。
  • 最终我通过使用这些按位运算做到了这一点:(a >> 1) + (b >> 1);
  • @MaxShpak - 你可能刚刚完成了a / 2 + b / 2 然后......
  • 是的,我知道。但优先级是按位运算:)
猜你喜欢
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多