0

In last iteration of the loop result is wrong. I know that before subtraction numbers can be bigger than long. That is why I set power to long long. Result in last iteration should be 17888888888888888889. Why it is not?

  const int NR_LEVELS = 18;
  unsigned long levels[NR_LEVELS];
  unsigned long long power = 10;
  for(unsigned int i = 0; i < NR_LEVELS; i++) {
    levels[i] = ((i+1)*10*power-(i+2)*power+1)/9;
    cout << levels[i] << endl;
    power *= 10;
  }
  levels[17] = 17888888888888888889lu;
  for(unsigned int i = 0; i < NR_LEVELS; i++) {
    cout << levels[i] << endl;
  }
4

1 に答える 1

3

中間値 (9 で除算する前) は 64 ビット整数をオーバーフローします。それが、期待した結果が得られない理由です。

より正確には、64 ビット整数の最大値は次のとおりです。

18446744073709551615

除算前の (最小) 中間値との比較:

161000000000000000001

longこの回答は、コード内の型が 64 ビットの整数型に変換されることを前提としています (標準では、long型が少なくとも 32 ビットであることを義務付けているため、環境によっては 32 ビットの整数型を取得することもできます)。OS、コンピュータのアーキテクチャ、コンパイラによって、型の上限longが異なる場合があります。

于 2013-04-06T20:25:52.940 に答える