【问题标题】:Java: Adding large numbers without using BigIntegerJava:在不使用 BigInteger 的情况下添加大数
【发布时间】:2015-11-07 01:26:33
【问题描述】:

我查看了本网站上提出的这些问题的其他示例,但它们都比我知道如何处理和使用要复杂得多。基本上,我如何在不使用 BigInteger 类的情况下对大数求和,甚至存储大数以便以后求和?数字如此之大,它们甚至不适合长。

我现在的想法是使用字符数组,但我不知道如何添加超大数字,即使我能够将数字存储在字符数组中。任何帮助都会很棒。谢谢。

【问题讨论】:

  • 您应该使用 BigInterger,它们适用于大数字,并且在内部使用最有效的方式来处理大数字。如果您想了解实现细节,那么您可以在开源中找到很多...
  • 自从您学习小学数学以来,将数字相加并没有改变。
  • 是的,重点是不要使用 BigInteger 类。
  • 我现在意识到解决方案就是这么简单,我只是很难考虑如何处理这种问题。但我感谢您的帮助。

标签: java


【解决方案1】:

假设您将大量数字存储在一个 long 数组中。然后你需要做的就是将每一对相加,检测是否有溢出,然后将一个添加到下一对。这与我们实际手动添加的方式完全相同。假设我们要计算:

 5879
+6843

我们所做的是我们将 9 和 3 加在一起,它溢出并变成 2。然后我们将 7 和 4 相加,并从溢出中相加得到 2。我们再次溢出。接下来,我们将 8 和 8 + 1 相加为溢出得到 7,再次溢出。最后,我们将 5 和 6 + 1 加到溢出,得到 2 溢出。因此我们得到 12722。现在想象这些数字中的每一个在您的数组中都是一个长整数。

检测溢出:如果你有两个正数,当它们相加时,只有当它们溢出时才会产生一个负数。所以你只需要检查result是否小于0来检测是否需要在下一对中添加一个。

【讨论】:

  • 这可能是作业的重点,教学生如何像这样解决问题,而不是使用图书馆为他们完成工作。我记得我在 CS 时代的一项任务,我们必须以类似的方式计算阶乘。练习的目的是让我们弄清楚如何像在纸上那样做数学。
  • 当我有任何阶乘写作问题时,我会给他们Binet's formula ;) 太糟糕了,他们在考试中没有问这种问题...
  • 感谢 Flying_Banana,真的很有帮助:)
【解决方案2】:

你想要的答案:

如果您不使用 Big- 类,我建议您使用 String 进行一些解析,最好使用科学记数法以避免长 String"bibles",以及尽可能让你的代码结构在逻辑而不是string 上工作(因为相比之下String 又慢又重)。

编辑注意:关于我的意思的示例,让你的结构在逻辑上而不是字符串上工作,请参阅 Flying_Banana 的回答。


正确答案:

学习使用Big-。只要有可能,不要编码简单代码

【讨论】:

  • 我希望我能学会使用 Big 类,除非我不被允许。这就是为什么我需要问这个问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多