【问题标题】:Convert really big number from binary to decimal and print it将非常大的数字从二进制转换为十进制并打印
【发布时间】:2010-10-31 21:49:14
【问题描述】:

我知道如何将二进制转换为十进制。我至少知道 2 种方法:table 和 power ;-)

我想将二进制转换为十进制并打印这个十进制。此外,我对这个“小数”不感兴趣;我只想打印出来。

但是,正如我在上面所写的,我只知道将二进制转换为十进制的两种方法,而且它们都需要加法。因此,我正在计算二进制 1 或 0 的一些值,并将其添加到记住的值中。这是一个很薄的地方。我有一个非常非常大的数字(1 和 64 个零)。在转换时,我需要将一些中间结果放在一些“变量”中。在 C 中,我有一个 `int' 类型,它只有 4 个字节并且不超过 10^11。

所以,在从二进制转换为十进制时,我没有足够的内存来存储中间结果。正如我上面写的,我对那个小数不感兴趣,我只想打印结果。但是,我没有看到任何其他方法来解决它;-( 有没有从二进制“打印”的解决方案?

或者,也许,我应该使用像 BCD(二进制编码的十进制)这样的东西来表示中间表示?我真的不想用这个,因为它不是那么跨平台(英特尔的处理器有一个内置的功能,但对于其他的我需要编写自己的实现)。

我很高兴听到你的想法。感谢您的耐心。

语言:C.

【问题讨论】:

  • 只是一个问题,这个二进制数是如何存储的?
  • 将随机位(或四位序列)转换为十进制数字并非易事。我们希望能做到这一点的最著名的例子是使用 pi 的 BPP 算法:你可以计算任何位或任何 hex 数字,但你可以' t 使用该算法获取十进制数字(除非您想进行大量转换)

标签: c binary decimal bignum bcd


【解决方案1】:

你不能为 5 个 int 分配内存,并将你的数字存储在数组的开头吗?然后以 int 大小的块手动迭代数组。也许是这样的:

int* big = new int[5];
*big = <my big number>;

【讨论】:

    【解决方案2】:

    嗯,当从二进制转换为十进制时,您真的不需要同时使用所有二进制位。您只需要您当前正在计算幂的位,并且可能需要一个双变量来保存结果。 您可以将二进制值放入一个数组中,比如说 i[64],遍历它,根据它的位置获取功率并继续将其添加到双精度数中。

    【讨论】:

    • 你不需要很多吗? 999999 是 0xf423f,但是如果你在第二个最低有效十六进制数字中更改一位(所以你有 0xf427f),每个十进制数字都会改变,你会得到 1000063。
    【解决方案3】:

    最大的标准整数数据类型是unsigned long long int - 在我的系统(x86 上的 32 位 Linux)上,它的范围为 0 - 1.8*10^20,这对您来说还不够,所以您需要创建自己的类型(结构或数组)并为该类型编写基本数学(基本上你只需要一个加法)。

    如果我是你(并且内存不是问题),我会使用一个数组 - 每个十进制数字一个字节,而不是 BCD。 BCD 更紧凑,因为它每个字节存储 2 个十进制数字,但您需要付出更多的努力分别处理高半字节和低半字节。

    要打印,您只需将'0'(字符,而不是数字)添加到数组的每个字节,您就会得到一个可打印的字符串。

    【讨论】:

    • 是的,经过一夜之后,我找到了相同的解决方案;-)
    【解决方案4】:

    我强烈推荐使用诸如GMP(GNU 多精度库)之类的库。对于大整数,您可以使用 mpz_t 数据类型,各种 import/export routines 将您的数据放入 mpz_t,然后使用 mpz_out_str() 以基数 10 打印出来。

    【讨论】:

    • 第二。 GMP 让这些事情变得简单。
    • GMP我很了解,但我不是我想要的。
    • 为什么不想要 GMP? LGPL 不适合您吗?大约需要 3 次函数调用来实现您想要的(导入、打印、清理),而且它比您想出的任何东西都更快且错误更少。
    【解决方案5】:

    转换为十进制实际上意味着计算十的每个幂,那么为什么不将它们存储在一个字节数组中呢?然后打印只是循环遍历数组。

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2011-07-19
      • 2018-03-15
      • 2010-10-31
      相关资源
      最近更新 更多