【问题标题】:Why won't this function count more than 10 digits?为什么这个函数计数不超过 10 位?
【发布时间】:2014-01-10 10:17:05
【问题描述】:

我编写了这个函数来计算并返回传递给函数的数字的位数或长度。在你告诉它计算一个超过 10 位数字的数字之前,它的效果很好。在这些情况下,它只返回 1。

int digits(int z)
{
  int counter = 1;
  for ( double y = 9; z > y; y = (y*10) + 9)
  {
    counter++;
  }
return counter;
}

【问题讨论】:

  • 我能知道失败的号码是多少??并确保您没有超过 C++ 中允许的 int 范围。
  • 你实际上不能告诉这个函数对这么大的数字做任何事情,因为你不能传递这么大的数字。
  • 我想我明白了。如果我将函数及其参数声明为 double 会起作用吗?
  • @user3035328 取决于其余代码。如果您只是将整数从调用者转换为双精度,它仍然不会,否则是的(舍入错误除外)
  • @user3035328 它会增加范围,但是如果您对整数感兴趣,那么您可能想要使用 long longstd::int64_t (这很可能会更快,您不会有担心舍入错误)。

标签: c++ digits


【解决方案1】:

在您的目标机器上,整数很可能是 32 位。如果有符号,则整数的值介于(大约)-20 亿和 +20 亿之间。任何一个极端都是 10 位数长。

您可以更改您的代码以使用 64 位整数来获得更多里程。否则,您将需要使用自定义表示(即,编写您自己的大整数类)来允许任意大的数字。

【讨论】:

  • 如何编写这样的类? @史蒂文汉森
  • 这可能是另一篇文章的主题。它通常涉及以某种方式存储单个数字的数组。
【解决方案2】:

4 字节 int 的范围是从 –2,147,483,6482,147,483,647

如果您指定任何小于 2,147,483,647 的正数,那么它将计算它,否则它将返回 1。

【讨论】:

    【解决方案3】:

    我认为你应该检查范围。 至于 int 它是 -2,147,483,648 到 2,147,483,647 任何小于下限的数字,即 -2,147,483,648 或任何大于上限的数字,即 2,147,483,647 都会产生 1 作为结果。您已在问题中指定。 click here了解详情。

    【讨论】:

      【解决方案4】:

      您的代码有问题:

      1. 不考虑负值
      2. 使用浮点数

      到地址 1.: 你需要一个绝对值:int u = std::abs(z)。

      注意:最大负整数的绝对值没有定义。

      到地址 2: 如果 10

      另外:由于乘以 10 时溢出,您正在执行的测试很可能通过了一个负数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        • 2018-10-28
        • 2013-01-16
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 2012-12-05
        相关资源
        最近更新 更多