【问题标题】:How to know the number of digits in an integer如何知道整数的位数
【发布时间】:2020-07-09 23:07:44
【问题描述】:

我是编程新手,我想知道,我如何知道用户输入的整数的位数?例如:用户输入123456这样的数字,我怎么知道用户输入了6位数字?我不想使用for 循环来获取用户输入,因为我不希望用户在 spaceenter 之后输入每个数字。

现在,我正在将一个数字转换为一个数字数组,以便我可以控制它们,但问题是我不知道我应该循环多少位,因为我不知道如何数字中有很多数字。

我可以将用户的输入作为字符串获取,然后使用string.length 并将其转换为数字数组吗?

#include <iostream>

using namespace std;

int main()
{
    int N;
    cin >> N;
    while(N--)
    {
        int num;
        cin >> num;

        int arr[1000];
        for (int i=0 ;i<???;i++)
        {
            arr.[i]=num%10;
            num = num /10;
        }

    }
}

【问题讨论】:

  • 注意:我不能从用户那里获取num中的元素个数
  • 感谢安德烈亚斯的留言 :)
  • 只是一个元评论:你已经得到解释如何做到这一点的答案。但请记住,integer 没有数字。它所拥有的只是一个价值。它的文本表示有数字。所以这里的问题可能是“如果我有一个整数值,如果我将它转换为文本,我最终会得到多少位数字?”。另一方面,正如答案所指出的那样,如果输入是文本,您需要做的就是计算字符数。将这些字符转换为整数值对解决方案没有任何帮助。

标签: c++


【解决方案1】:

一种更简单的方法是将其转换为字符串,然后计算所述字符串的长度

#include <iostream>
#include <string>

using namespace std;  
int main()  {  
    int n;
    cin >> n;

    string str = to_string(n);
    cout <<"the length of" <<str << "is:" <<str.length() <<"\n";  
}  

输入 41 会打印出来。

41的长度是2

【讨论】:

  • 哦,是的,我忘了std::to_string()
  • 感谢您的回答,对此感到抱歉,但 to_string 实际上在内部做了什么?并且你推荐在我开始学习编程的时候使用那些现成的方法吗??
  • @logan_92 "to_string 实际上在内部做了什么??" - 这真的很重要吗?那是一个实现细节。它可以使用任何它想要的技术将整数转换为字符串。重要的是它有效。
  • 我不知道,我正在尝试学习编程,所以如果我想为自己做一些方法或功能,我会尝试了解这些东西是如何工作的。我不知道这种学习编程的方法是否正确。
  • @logan_92 我推荐这种方法。学习和使用所有可用的工具。然后,当您确实需要实现一些不可用的东西时,您可以查看这些工具(您知道如何使用)在后台是如何工作的,然后对其进行调整。
【解决方案2】:
        while (num != 0)
        {
            arr.[i]=num%10;
            num = num /10;
        }

是一种常见的模式,接近于您已有的模式。

尽管您可以执行您在问题中提到的内容以及在 cmets 中建议的内容,并将输入作为字符串获取并使用 string.length

【讨论】:

  • "我不能在开头定义数组的大小" - 是的,你可以,因为整数有最大位数 - 3 位代表 8-位 int,16 位 int 为 5 位,32 位 int 为 10 位,64 位 int 为 19 位。因此,您实际上并不需要为您正在使用的整数类型分配大于最大值的数组。
  • @logan_92 您将字节与数字混淆了。它们不是同一件事。您正在尝试生成一个数字数组,而不是字节数组。整数的字节大小将始终小于其最大位数:8 位 = 1 字节 = 最多 3 位 (255),16 位 = 2 字节 = 最多 5 位 (65535),32 位 = 4 字节 = 最多 10 位 ( 4294967295),并且 64 位 = 8 字节 = 最多 19 位 (9223372036854775807)。在您的示例中,123456 是 6 位数字,使用 17 位,因此它需要 32 位或更大的整数。
  • 32 位 = 2 的 32 次方 = 最大 4294967295 无符号 int32。对于有符号的 int32,(2 的 31 次方)- 1 = 2147483647 最大值
  • @logan_92 在计算机中,整数表示为 2 的幂。位数表示 2 可以达到的最高幂。
  • @logan_92 2 的 16 次方,负 1,是 65535,最高 16 位整数。不要忘记负 1,这很重要,因为整数处理零和负数的方式。如果您想了解更多信息,请参阅有关此主题的书籍。
【解决方案3】:

是的,您可以将用户的输入读取为std::string 而不是int,然后您可以使用std::string::size()(或std::string::length())来获取字符串中的字符数,例如:

#include <iostream>
#include <string>

int main()
{
    std::string S;
    std::cin >> S;

    int arr[1000] = {};
    for (size_t i = 0; i < S.size(); ++i)
    {
        arr[i] = (S[i] - '0');
    }

    return 0;
}

或者:

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string S;
    std::cin >> S;

    int arr[1000] = {};
    std::transform(S.begin(), S.end(), arr, [](char ch){ return int(ch - '0'); });

    return 0;
}

无论哪种方式,如果需要,您可以使用std::stoi()std::strtol() 或其他类似函数检查std::string 是否表示有效整数,或者将std::string 放入std::istringstream 然后读取整数。

否则,您可以将用户的输入读取为int,然后将其转换为std::string 进行处理:

#include <iostream>
#include <string>

int main()
{
    unsigned int N;
    std::cin >> N;

    std::string S = std::to_string(N);

    int arr[1000] = {};
    for (size_t i = 0; i < S.size(); ++i)
    {
        arr[i] = (S[i] - '0');
    }

    // or:
    // std::transform(S.begin(), S.end(), arr, [](char ch){ return int(ch - '0'); });

    return 0;
}

否则,如果你真的想读入 int 并直接循环其数字,你可以使用类似这样的东西:

#include <iostream>

int main()
{
    unsigned int N;
    std::cin >> N;

    int arr[1000] = {};
    size_t i = 0;

    while (N != 0)
    {
        arr[i++] = num % 10;
        num /= 10;
    }

    return 0;
}

【讨论】:

  • 雷米,我真的很感谢你为回答我的问题所做的辛勤工作,谢谢你。我只是想理解那一行 arr[i] = (S[i] - '0') ; ,它是做什么的,它会将字符串转换为数字吗??
  • @logan_92:看看ASCII table。它从字符的 ASCII 码中减去 '0'(计算结果为数字 48)。这有效地将字符的 ASCII 代码转换为数字的值。例如,数字 '8' 的 ASCII 码为 56。如果从中减去 '0' (=48),则得到数字 8。
  • @logan_92 不是一个完整的字符串,不是,而是一个单独的字符,是的。 char 是一个整数类型,就像 int,所以 char 可以对其应用算术运算。从 char '0' 中减去 char '0'(数值 48)会返回一个整数 48-48=0。从'1'(数值49)中减去'0'会返回一个整数49-48=1。以此类推,直到'9'(数值57),返回一个整数57-48=9。这是一种将字符 '0'..'9' 转换为整数 0..9 的快速简单的方法
  • 谢谢你的回答,我的最后一个问题 => 如果我假设 array[1000] 但我并不总是需要这个大小,这是我的代码优化中的缺陷吗??跨度>
  • @logan_92 请参阅my comment 上的Kevin Wang's answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2019-12-03
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多