0

在循环结果的最后一次迭代中是错误的。我知道减法之前的数字可能比 long 大。这就是为什么我将 power 设置为 long long。最后一次迭代的结果应该是 17888888888888888889。为什么不是?

  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 位整数类型)。根据操作系统、计算机体系结构和编译器,类型的上限long可能会有所不同。

于 2013-04-06T20:25:52.940 回答