【问题标题】:C++ get each digit in intC ++获取int中的每个数字
【发布时间】:2011-01-06 12:48:36
【问题描述】:

我有一个整数:

int iNums = 12476;

现在我想从 iNums 中获取每个数字作为整数。比如:

foreach(iNum in iNums){
   printf("%i-", iNum);
}

所以输出将是:“1-2-4-7-6-”。 但我实际上需要每个数字作为 int 而不是 char。

感谢您的帮助。

【问题讨论】:

    标签: c++


    【解决方案1】:
    void print_each_digit(int x)
    {
        if(x >= 10)
           print_each_digit(x / 10);
    
        int digit = x % 10;
    
        std::cout << digit << '\n';
    }
    

    【讨论】:

    • +1:你在递归解决方案上击败了我。我会把我的留在这里,但你先到了。
    • 请注意,此代码可能不会刷新 cout 流。将 &lt;&lt; '\n' 更改为 &lt;&lt; endl 以确保刷新 cout。
    • @Andreas 也请阅读Core Guidelines
    • 有人能解释一下这段代码是如何工作的吗?递归总是让我感到困惑。
    【解决方案2】:

    将其转换为字符串,然后遍历字符。对于转换,您可以使用std::ostringstream,例如:

    int iNums = 12476;
    std::ostringstream os;
    
    os << iNums;
    std::string digits = os.str();
    

    顺便说一句,通常使用的术语(你称之为“数字”)是“数字” - 请使用它,因为它使您的帖子标题更容易理解:-)

    【讨论】:

    • 我把那个数字改成了数字。
    • +1:这是在 C++ 中解决此类问题的最通用/最灵活的方法:学习这一点,您将为许多其他小任务做好准备。一旦你有了digits,你可以遍历字符串打印每个你喜欢的数字。
    • 打印没问题,但我需要数字作为 int 才能使用它们。
    • @Ilyssis,很公平,您在帖子中提到了这一点。我的错:-(
    • 别担心,我应该取一个更好的帖子标题。
    【解决方案3】:

    这是一个更通用但递归的解决方案,它产生一个数字向量:

    void collect_digits(std::vector<int>& digits, unsigned long num) {
        if (num > 9) {
            collect_digits(digits, num / 10);
        }
        digits.push_back(num % 10);
    }
    

    由于位数相对较少,递归是有界的。

    【讨论】:

    • 您正在混合有符号和无符号数据类型。此外,您不必要地将算法限制为 32 位。对 num 的向量和数据类型使用 unsigned long long 可以解决这两个问题。
    • @BenKey - 当我写这个 C++11 时还没有出现,所以 long long 不是标准的一部分。不过,您对混合签名和未签名是正确的。
    【解决方案4】:

    我不测试它只是写下我的想法。任何语法错误的借口

    这里是online ideone demo

    vector <int> v; 
    
    int i = ....
    while(i != 0 ){
        cout << i%10 << " - "; // reverse order
        v.push_back(i%10); 
        i = i/10;
    }
    
    cout << endl;
    
    for(int i=v.size()-1; i>=0; i--){
       cout << v[i] << " - "; // linear
    }
    

    【讨论】:

    • 这会以相反的顺序打印每个数字。
    • (-1) 因为你得到 7654321 而不是 1-2-3-4-5-7。
    • 朋友们有点粗心。不要那么苛刻
    • 我宁愿使用dequepush_front 并使用ostream_iterator 发送到cout。
    • @Benoit 感谢您的评论。是的,有很多方法可以解决这个问题,这是我首先想到的
    【解决方案5】:

    你可以用这个函数来做:

    void printDigits(int number) {
        if (number < 0) { // Handling negative number
            printf('-');
            number *= -1;
        }
        if (number == 0) { // Handling zero
            printf('0');
        }
        while (number > 0) { // Printing the number
            printf("%d-", number % 10);
            number /= 10;
        }
    }
    

    【讨论】:

      【解决方案6】:

      要在“pos”位置获取数字(从位置 1 开始作为最低有效位 (LSD)):

      digit = (int)(number/pow(10,(pos-1))) % 10;
      

      例子:number = 57820 --> pos = 4 --> digit = 7


      顺序获取数字:

      int num_digits = floor( log10(abs(number?number:1)) + 1 );
      for(; num_digits; num_digits--, number/=10) {
          std::cout << number % 10 << " ";
      }
      

      示例:number = 57820 --> 输出:0 2 8 7 5

      【讨论】:

      • 这是我需要的最简单的解决方案,谢谢
      【解决方案7】:

      这是执行此操作的方法,但这样您会得到相反的顺序。

      int num;
      short temp = 0;
      cin>>num;
      
      while(num!=0){
          temp = num%10;
          
          //here you will get its element one by one but in reverse order
          //you can perform your action here.
          
          num /= 10;
      }
      

      【讨论】:

      • 但是请注意,尽管您的解决方案确实非常“简单”,但它也会以 reverse 顺序生成数字的组成数字。这可能是不可取的。
      【解决方案8】:

      从 D.Shawley 的答案中得出,可以进一步通过输出结果来完全回答:

      void stream_digits(std::ostream& output, int num, const std::string& delimiter = "")
      {
          if (num) {
              stream_digits(output, num/10, delimiter);
              output << static_cast<char>('0' + (num % 10)) << delimiter;
          }
      }
      
      void splitDigits()
      {
          int num = 12476;    
          stream_digits(std::cout, num, "-");    
          std::cout << std::endl;
      }
      

      【讨论】:

        【解决方案9】:

        我不知道这是更快、更慢还是毫无价值,但这是一个替代方案:

        int iNums = 12476;
        string numString;
        stringstream ss;
        ss << iNums;
        numString = ss.str();
        for (int i = 0; i < numString.length(); i++) {
            int myInt = static_cast<int>(numString[i] - '0'); // '0' = 48
            printf("%i-", myInt);
        }
        

        我指出这一点是因为 iNums 暗示可能是用户输入,如果用户输入首先是一个字符串,那么您就不需要经历将 int 转换为字符串的麻烦。

        (to_string 可用于c++11)

        【讨论】:

          【解决方案10】:

          我知道这是一篇旧帖子,但所有这些答案对我来说都是不可接受的,所以我自己写了!

          我的目的是将数字渲染到屏幕上,因此是函数名称。

          void RenderNumber(int to_print)
          {
              if (to_print < 0)
              {
                  RenderMinusSign()
                  RenderNumber(-to_print);
              }
              else
              {
                  int digits = 1; // Assume if 0 is entered we want to print 0 (i.e. minimum of 1 digit)
                  int max = 10;
          
                  while (to_print >= max) // find how many digits the number is 
                  {
                      max *= 10;
                      digits ++;
                  }
          
                  for (int i = 0; i < digits; i++) // loop through each digit
                  {
                      max /= 10;
                      int num = to_print / max; // isolate first digit
                      to_print -= num * max; // subtract first digit from number
                      RenderDigit(num);
                  }
              }
          }
          

          【讨论】:

            【解决方案11】:

            基于@Abyx 的回答,但使用div,因此每个数字只进行 1 次除法。

            #include <cstdlib>
            #include <iostream>
            
            void print_each_digit(int x)
            {
                div_t q = div(x, 10);
            
                if (q.quot)
                    print_each_digit(q.quot);
            
                std::cout << q.rem << '-';
            }
            
            int main()
            {
                print_each_digit(12476);
                std::cout << std::endl;
                return 0;
            }
            

            输出:

            1-2-4-7-6-
            

            注意仅适用于非负整数。

            【讨论】:

              【解决方案12】:

              我的解决方案:

              void getSumDigits(int n) {
                  std::vector<int> int_to_vec;
                  while(n>0)
                  {
                      int_to_vec.push_back(n%10);
                      n=n/10;
                  }
              
                  int sum;
              
                  for(int i=0;i<int_to_vec.size();i++)
                  {
                      sum+=int_to_vec.at(i);
              
                  }
                  std::cout << sum << ' ';
              }
              

              【讨论】:

                【解决方案13】:

                我使用的答案是这个简单的函数:

                int getDigit(int n, int position) {
                
                    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1))) / (int)pow(10, position-1);
                
                }
                

                希望有人觉得这有帮助!

                【讨论】:

                  【解决方案14】:
                  int a;
                  cout << "Enter a number: ";
                  cin >> a;
                  
                  while (a > 0) {
                      cout << a % 10 << endl;
                      a = a / 10;             
                  }
                  

                  【讨论】:

                  • 请在您的答案/代码中添加mo解释,这将有助于更好地理解。
                  【解决方案15】:
                  int iNums = 12345;
                  int iNumsSize = 5;
                  for (int i=iNumsSize-1; i>=0; i--) {
                      int y = pow(10, i);
                      int z = iNums/y;
                      int x2 = iNums / (y * 10);
                      printf("%d-",z - x2*10 );
                  }
                  

                  【讨论】:

                  • 提前声明号码大小既繁琐又没必要
                  • 谢谢,这正是我所需要的,因为我有一个固定的数字大小。
                  • 或者,等一下,看看你是否得到了更好的答案。最快的不一定是最好的。
                  • @AliEl-sayedAli 这太可怕了。使用浮点数 pow() 来计算 integer 本质上是不准确的。对于某些大整数,这很可能会给出错误的结果。
                  猜你喜欢
                  • 2017-02-18
                  • 2023-04-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-10-16
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多