1

假设您有一个包含千兆字节的文件

deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef

并且您想将其转换为十进制,就像您将 0xdeadbeef 转换为 3,735,928,559 一样。

数字可被 2 整除的基数很容易做到这一点,因为您可以每隔几位操作并输出一个数字(base64 为 6)。

有没有办法用十进制做到这一点?

编辑:该文件代表一个长数字。它重复自己的事实与数字 55,055,055,055 没有什么不同。

EDIT2:文件的大小是已知的。然后怎样呢?

4

2 回答 2

5

您通常可以在阅读完输入之前开始写作。但如果数字非常接近 10 的幂,您可能需要读取一半以上的输入,然后才能写入输出的第一个数字!

要了解原因,请举一个相对较小的例子。假设数字是 10 60。对此的十六进制编码是 50 个十六进制数字。看完前 34 位数字,你就知道这么多了:

9f4f2726179a224501d762422c946590d9................

点是您尚未阅读的数字。

在这一点上,你仍然不能写输出的第一位,因为输入可以是任何来自

9f4f2726179a224501d762422c946590d90000000000000000

9f4f2726179a224501d762422c946590d9ffffffffffffffff

前者是十进制99999999999999999999999999999999999999999999999999999999999999998478495393153024 直到第 35 个输入数字才能开始写入输出。

通常,在最坏的情况下,在写入第一个输出数字之前,您必须阅读大约四分之三的输入内容。

于 2010-12-16T07:41:42.880 回答
0

错了,错了。看评论。

是的,但你必须向后工作(即从文件末尾开始)。

  1. 读取最后一位数字。
  2. 将数字转换为十进制,打印并存储最高有效位。
  3. 读左边的下一个数字。
  4. 添加前一个最高有效位,转换为十进制,打印并存储新的最高有效位。
  5. 从第 3 步开始重复。

编辑:添加了打印数字的位置。这会以相反的顺序(最低有效位在前)生成输出十进制数。

于 2010-12-16T06:52:15.357 回答