【问题标题】:How would you know the length of a long long你怎么知道长长的长度
【发布时间】:2018-08-08 10:08:05
【问题描述】:

我想知道如何获取long long 的长度。我有一个简单的函数,我试图获取long long 的长度,但我也得到了一个错误。

while (numberArray[i].length() > MAX_INPUT)
{
    cout << "ERROR: Program can only take in a number length " << MAX_INPUT << " or less. Try again ->";

    cin >> numberArray[i];
}

注意:numberArray 是一个静态的,被制成int。对.length() 的调用运行良好,但我想将类型更改为long long,现在.length() 似乎不再起作用了。

这是我每次尝试运行代码时从编译器得到的消息类型:

In function 'void takeNumbers(std::__cxx11::string&, long long int (&)[11], int)':
main.cpp:48:26: error: request for member 'length' in 'numberArray[i]', which is of non-class type 'long long int'
    while (numberArray[i].length() > MAX_INPUT){

【问题讨论】:

  • 你不能像在 C++ 中那样只获得整数的长度。您可以将数字转换为字符串,然后使用 std::to_string 获取其长度。
  • 在 C++ 中整数不能有成员函数,因为它们不是类。你认为length() 函数应该做什么?整数的“长度”是多少?您是否试图找到 long long 的最大值?
  • 注:当类型为int 时,它无法工作,因为你也不能在int 上调用成员函数,它不是一个类,所以没有成员函数。
  • “长度”是一个用于表示数字的奇怪术语。任何数字都可以在 C++ 中以十进制、二进制、十六进制或八进制表示形式表示。我猜“长度”是指十进制表示中的位数?

标签: c++


【解决方案1】:

在 C++ 中,诸如long long int 之类的普通旧数据类型没有用于获取其长度的成员函数。如果您想要整数的长度,可以将数字转换为字符串,然后取其长度。例如:

while (std::to_string(numberArray[i]).length() > MAX_INPUT)

这利用了 std::to_string 函数,该函数用于将非字符串 POD 类型转换为 std::string 类。

但假设您也需要处理负整数。上述方法不起作用,因为前导减号将被计为长度的一部分(除非你想要那样)。另一种方法是使用循环和除法来查找整数的长度并将此循环放在函数中,如下所示:

std::size_t numDigits(long long int n)
{
    std::size_t length = 0;

    do
    {
        ++length; 
        n /= 10;
    } while (n);

    return length;
}

然后在你的循环中:

while (numDigits(numberArray[i]) > MAX_INPUT)

根据您的目标,您可以选择任一方法。

【讨论】:

  • 函数应该叫numDigits或者numDecimalDigits什么的。整数没有“长度”。
  • @JonathanWakely 我听从了你的建议。
  • 另外你忘了考虑- 符号。
  • @JonathanWakely 这正是我提出第二种方法的原因,我只是忘了列出原因。
【解决方案2】:

您需要滚动自己的函数:数字的长度是任意的,因为它假设一个基数,并且需要对非正数的处理做出假设。作为起点,考虑

unsigned length(unsigned long long n, unsigned radix = 10)
{
    unsigned l;
    for (l = 0; n; n /= radix, ++l);
    return l;
}

您可以在哪里将其扩展为负数(是否应该将长度增加一倍?)以满足个人喜好。

请注意,这将 0 用于数字 0:这就是我对 0 长度的看法,但这并不符合每个人的口味。

【讨论】:

    【解决方案3】:

    为了完整起见,另一种方法可能是使用如下查找表:

    unsigned num_digits(long long x)  
    {  
        x = std::abs(x);      
        if(x < 10)
           return 1;
        else if(x < 100)
           return 2;
        else if(x < 1000)
           return 3;
        //keep going ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 2019-06-25
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多