【问题标题】:How to represent a number that longer than long and print it如何表示一个长于 long 的数字并打印出来
【发布时间】:2021-03-17 19:31:54
【问题描述】:

我有一个 int 数组,它的每个单元格都包含数字 0/1,该数组表示一个二进制数。 我想打印数组的十进制数表示。为此,我需要将单元格中的每个位转换为 2^n 形式(n 是单元格编号)并汇总所有幂。 但是,对于大型数组,总和可能会超过长边界。 我正在寻找一个不使用 BigInteger/BigDecimal 类的解决方案 - 这是我在大学时获得的作业的一部分。

【问题讨论】:

  • 然后你必须实现一个像BigInteger 这样的类,它使用int[] 来存储它的值。但是你为什么要那样做!?!
  • 为什么不使用double的原始类型?
  • @Agus 精度损失。问题已经说有超过 63 位(因为它超过了 long 的容量),所以 double 支持的 53 位精度更差。
  • 您可以将结果表示为一个字节数组,其中每个字节代表一个(十进制)数字。为了能够将一系列 1 和 0 转换为十进制数,您只需要对该数据执行两项操作:将其加倍(= 将其添加到自身)并将其添加 1。
  • 字节数组。您可能想搜索“二进制编码的十进制”,通常缩写为 BCD。在像我这样的恐龙进行编程的旧时代的计算中,这经常用于此目的。

标签: java arrays binary


【解决方案1】:

我建议你使用BitSet,将位数初始化为你的数组长度,遍历数组设置对应的位,然后用toByteArray()方法得到得到的字节数组。您可以解析生成的字节数组或将其提供给 BigInteger 构造函数。

【讨论】:

    【解决方案2】:

    您必须手动添加任意大小的数字。

    在伪代码中:

    实现手动添加函数add(a, b)

    创建变量 power2 = 1 和 total = 0
    在数组上从低位循环到高位

    • 如果设置了位,total = add(total, power2)
    • power2 = add(power2, power2)

    返回总数

    【讨论】:

      【解决方案3】:

      如何表示一个长于long的数字并打印出来

      为此不需要完整的数字表示(如BigInteger)。

      如果您只想打印一个包含零和一的int[] 作为二进制数,那么简单的方法就是使用String 来表示数字。

      你可以像这样构建它:

      StringBuilder sb = new StringBuilder(array.length);
      for (int i: array) {
          sb.append(i == 0 ? "0" : "1");
      }
      String binary = sb.toString();
      

      请注意,上面的效率比:

      ....
          binary += (i == 0 ? "0" : "1");
      ....
      

      这可以使用 Java 8+ 流更简洁地完成。


      我想打印数组的十进制数表示。

      如果字面意思是你想要做的,那么你实际上至少需要一个有限的“大数字”实现。 (重复除以 10 就足够了。)

      但是,我实际上并没有看到将有效的位数组(零和一)转换为以 10 为底的数字的意义。


      为此,我需要将单元格中的每个位转换为 2^n 形式(n 是单元格编号)并汇总所有幂。

      我不知道你所说的“总结权力”是什么意思,但我怀疑这是因为你认为你需要十进制数字表示。

      【讨论】:

      • 很公平,但他写道他想打印 十进制数字表示
      • 啊。好的。但是让我们看看OP怎么说。 (因为打印十进制表示似乎不是一件特别有用的事情。)我倾向于认为 OP 没有清楚准确地表达自己......
      猜你喜欢
      • 2023-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多