【问题标题】:How do I split an int into its digits?如何将 int 拆分为数字?
【发布时间】:2010-11-23 22:23:17
【问题描述】:

如何将 c++ 中的 int 拆分为单个数字?例如,我想将 23 拆分为 2 和 3。

【问题讨论】:

  • 把它想象成一个脑筋急转弯。如果您仍然不知道该怎么做,请发布您尝试过的内容,人们可以发表评论。

标签: c++


【解决方案1】:

给定数字 12345:

512345 % 10
412345 / 10 % 10
312345 / 100 % 10
212345 / 1000 % 10
1 是 @9876@34

我不会提供完整的代码,因为这看起来确实像家庭作业,但我相信你会明白这个模式。

【讨论】:

    【解决方案2】:

    逆序数字提取器(例如,23 将是 3 和 2):

    while (number > 0)
    {
        int digit = number%10;
        number /= 10;
        //print digit
    }
    

    正常顺序数字提取器(例如,23 将是 2 和 3):

    std::stack<int> sd;
    
    while (number > 0)
    {
        int digit = number%10;
        number /= 10;
        sd.push(digit);
    }
    
    while (!sd.empty())
    {
        int digit = sd.top();
        sd.pop();
        //print digit
    }
    

    【讨论】:

    • 我记得你说的,当我对可执行文件进行逆向工程时,我看到了字符是如何存储的,比如第一个值在内存的高位,最终值是最低地址而不是最终地址,看到你的评论我惊呆了!!
    • 其实应该是do-while-loops,否则不会为输入0生成正确的结果。
    【解决方案3】:

    以下方法可以解决问题

    void splitNumber(std::list<int>& digits, int number) {
      if (0 == number) { 
        digits.push_back(0);
      } else {
        while (number != 0) {
          int last = number % 10;
          digits.push_front(last);
          number = (number - last) / 10;
        }
      }
    }
    

    【讨论】:

    • 减法有必要吗?整数除法等等。我通常在这样的代码中以number /= 10 结束。
    【解决方案4】:

    这个问题的简单答案可以是:

    1. 从用户那里读取数字“n”。
    2. 使用 While 循环确保它不为零。
    3. 取数字“n”的模 10..这将为您提供最后一位。
    4. 然后将数字“n”除以 10..这将删除数字的最后一位 "n" 因为 int 小数部分被省略。
    5. 显示数字。

    我认为它会有所帮助。我使用了简单的代码,例如:

    #include <iostream>
    using namespace std;
    int main()
    {int n,r;
    
        cout<<"Enter Your Number:";
        cin>>n;
    
    
        while(n!=0)
        {
                   r=n%10;
                   n=n/10;
    
                   cout<<r;
        }
        cout<<endl;
    
        system("PAUSE");
        return 0;
    }
    

    【讨论】:

      【解决方案5】:

      将其转换为字符串或 char[] 并在其上循环

      【讨论】:

      • 呃。这再好不过了。
      • 详细说明。在这种情况下,将 'int' 直接转换为 'char[]' 是没有意义的。
      • +1,要求很傻,提供的解决方案让它变得微不足道。
      【解决方案6】:

      经典技巧是使用模 10: x%10 给你第一个数字(即个位)。对于其他人,您需要先划分(如许多其他帖子所示)

      这是一个将所有数字放入向量中的小函数(这似乎是您想要做的):

      using namespace std;
      vector<int> digits(int x){
          vector<int> returnValue;
          while(x>=10){
              returnValue.push_back(x%10);//take digit
              x=x/10; //or x/=10 if you like brevity
          }
          //don't forget the last digit!
          returnValue.push_back(x);
          return returnValue;
      }
      

      【讨论】:

      • x%10 给你最后一个数字而不是第一个数字,你的代码将返回向量中的数字,但顺序相反。
      • 我总是将单位视为第一位。当然,我的代码确实以相反的顺序发送数字,但它确实避免了必须知道 x 中间函数的“长度”。
      • 使用双端队列,您可以将它们推到前面并按正确的顺序排列
      【解决方案7】:

      声明一个数组并像这样将单个数字存储到数组中

      int num, temp, digits = 0, s, td=1;
      int d[10];
      cout << "Enter the Number: ";
      cin >> num;
      temp = num;
      do{
          ++digits;
          temp /= 10;
      } while (temp);
      
      for (int i = 0; i < digits-1; i++)
      {
          td *= 10;
      }
      
      s = num;
      for (int i = 0; i < digits; i++)
      {
          d[i] = s / td %10;
          td /= 10;
      
      }
      

      【讨论】:

        【解决方案8】:
        int n = 1234;
        std::string nstr = std::to_string(n);
        std::cout << nstr[0]; // nstr[0] -> 1
        

        我认为这是最简单的方法。

        我们需要使用 std::to_string() 函数将我们的 int 转换为字符串,以便它会自动使用我们的数字创建数组。我们可以简单地使用索引来访问它们——nstr[0] 将显示 1;

        【讨论】:

          【解决方案9】:

          从适合您平台上 int 的 10 的最高幂开始(对于 32 位 int:1.000.000.000),然后对其进行整数除法。结果是最左边的数字。从原始数字中减去这个结果乘以除数,然后以 10 的下一个较低的幂继续相同的游戏,并迭代直到达到 1。

          【讨论】:

            【解决方案10】:

            您可以使用一系列 x/10.0f 和 std::floor 操作来获得“数学方法”。 或者您也可以使用 boost::lexical_cast(the_number) 来获取一个字符串,然后您可以简单地执行 the_string.c_str()[i] 来访问单个字符(“字符串方法”)。

            【讨论】:

              【解决方案11】:

              我不一定推荐这个(使用数字而不是将其转换为字符串更有效),但它很容易并且有效:)

              #include <algorithm>
              #include <iostream>
              #include <iterator>
              #include <string>
              
              #include <boost/lexical_cast.hpp>
              
              int main()
              {
                  int n = 23984;
                  std::string s = boost::lexical_cast<std::string>(n);
                  std::copy(s.begin(), s.end(), std::ostream_iterator<char>(std::cout, "\n"));
                  return 0;
              }
              

              【讨论】:

                【解决方案12】:
                int n;//say 12345
                string s;
                scanf("%d",&n);
                sprintf(s,"%5d",n);
                

                现在您可以通过s[0]s[1] 等访问每个数字

                【讨论】:

                  【解决方案13】:

                  你可以数一数你想先打印多少位数

                  #include <iostream>
                  #include <cmath>
                  using namespace std;
                  
                  int main(){
                  int number, result, counter=0, zeros;
                  
                  do{
                      cout << "Introduce un numero entero: ";
                    cin >> number;
                  
                    }while (number < 0);
                  
                    // We count how many digits we are going print
                    for(int i = number; i > 0; i = i/10)
                          counter++;
                  
                     while(number > 0){
                  
                         zeros = pow(10, counter - 1);
                  
                         result = number / zeros;
                         number = number % zeros;
                         counter--;
                  
                         //Muestra resultados
                         cout << " " << result;
                     }
                     cout<<endl;
                  

                  }

                  【讨论】:

                    【解决方案14】:

                    根据icecrime 的回答我写了这个函数

                    std::vector<int> intToDigits(int num_)
                    {
                        std::vector<int> ret;
                        string iStr = to_string(num_);
                    
                        for (int i = iStr.size() - 1; i >= 0; --i)
                        {
                            int units = pow(10, i);
                            int digit = num_ / units % 10;
                            ret.push_back(digit);
                        }   
                    
                        return ret;
                    }
                    

                    【讨论】:

                      【解决方案15】:
                          int power(int n, int b) {
                          int number;
                          number = pow(n, b);
                          return number;
                      }
                      
                      
                      void NumberOfDigits() {
                          int n, a;
                          printf("Eneter number \n");
                          scanf_s("%d", &n);
                          int i = 0;
                          do{
                              i++;
                          } while (n / pow(10, i) > 1);
                          printf("Number of digits is: \t %d \n", i);
                      
                          for (int j = i-1; j >= 0; j--) {
                              a = n / power(10, j) % 10;
                              printf("%d \n", a);
                          }
                      }
                      
                      int main(void) {
                          NumberOfDigits();
                      }
                      

                      【讨论】:

                        【解决方案16】:
                        #include <iostream>
                        
                        using namespace std;
                        
                        int main()
                        
                        {
                        
                        
                        int n1 ;
                        
                        cout <<"Please enter five digits number: ";
                        cin >> n1;
                        
                            cout << n1 / 10000 % 10 << " ";
                            cout << n1 / 1000 % 10 << " ";
                            cout << n1 / 100 % 10 << " ";
                            cout << n1 / 10 % 10 << " ";
                            cout << n1 % 10 << " :)";   
                        
                        cout << endl;
                        
                        return 0;
                        }
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-07-08
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-07-16
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多