显示非常大的数字,由byte []表示

时间:2012-09-14 01:33:58

标签: c++ c math integer bit-manipulation

这是一个荒谬的问题,我已经想到了一段时间,但是我想说我想显示一个非常非常大的数字,一个不能用普通原语(或组合)表示的数字原语...没有long long ... s),所以我想可以使用内存中的字节数组。

如果我有一个n字节的字节数组(其中n是大的)长度,我怎么能正确地打印出字节数组,好像它是一个十进制的十进制整数。优选解释而不仅仅是答案。

1 个答案:

答案 0 :(得分:4)

最简单的(实现和理解)是将数字重复除以10,收集余数,例如:

1234/10 = 123,4 123/10 = 12,3 12/10 = 1,2 1/10 = 0,1

然后打印剩余部分(按相反顺序)。

当将字节序列除以10时,您将单独划分每个字节,从最高有效字节开始。并且您将余数从除法传递到下一个字节,直到您处理完所有字节为止。

int divBytesBy10(unsigned char* bytes, size_t count, unsigned char* remainder)
{
  unsigned carryOver = 0;
  int nonZeroQuotient = 0;

  while (count--)
  {
    carryOver = carryOver * 256 + *bytes;
    *bytes = carryOver / 10;
    carryOver %= 10;

    nonZeroQuotient |= *bytes++;
  }

  *remainder = carryOver;
  return nonZeroQuotient;
}

一个完整的例子:

#include <stdio.h>

int divBytesBy10(unsigned char* bytes, size_t count, unsigned char* remainder)
{
  unsigned carryOver = 0;
  int nonZeroQuotient = 0;

  while (count--)
  {
    carryOver = carryOver * 256 + *bytes;
    *bytes = carryOver / 10;
    carryOver %= 10;

    nonZeroQuotient |= *bytes++;
  }

  *remainder = '0' + carryOver; // convert to ASCII right here
  return nonZeroQuotient;
}

int main(void)
{
  unsigned char num[] = {0xFF, 0xFF, 0xFF, 0xFF};
  char str[11], *p = str + sizeof(str) - 1;
  *p = '\0';
  while (divBytesBy10(num, sizeof(num), --p)) {}
  printf("%s\n", p);
  return 0;
}

输出(ideone):

4294967295