1

これはちょっとばかげた質問で、私はしばらく頭に浮かんでいましたが、通常のプリミティブ (またはプリミティブの組み合わせ. .. no long long ...s) であるため、メモリ内のバイト配列を使用できると思います。

n バイト (n は何か大きなもの) の長さのバイト配列がある場合、10 進数の整数であるかのように、バイト配列を正しく出力するにはどうすればよいでしょうか。単なる回答ではなく、説明が望ましいでしょう。

4

1 に答える 1

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
于 2012-09-14T02:04:47.883 に答える