【问题标题】:how to split an integer and add everything to an array? [duplicate]如何拆分整数并将所有内容添加到数组中? [复制]
【发布时间】:2019-10-11 16:11:58
【问题描述】:

有一个类似的数字

int a = 12345;

我需要单独做

int arr[4]{1,2,3,4,5};

但事实是,我不知道这个数字会是多少 可长可短。

【问题讨论】:

  • 最简单的方法是使用std::vector,一次又一次地推回10的余数,然后反转向量。假设 32 位 int,您之前可能会 vector.reserve(11),因为这将是可能出现的最大位数。你也需要考虑负面输入吗?
  • 顺便说一下,您的数组中的一位数太少了...

标签: c++


【解决方案1】:

想想当你将一个数除以 10 时会发生什么。

12345 除以 10 等于多少?是 1234。这个除法的余数是多少?它是 5。您现在已将最低有效数字与其余数字分开。你怎么可能得到下一个数字?请记住,你已经有 1234。好吧,你重复除以 10,现在你有 123 和 4。重复直到你不再有数字。这就是您正在寻找的算法。

这适用于 10,因为它是十进制表示的基数(即基数)。通过使用有问题的基数,相同的算法适用于其他表示。该算法演示了除以基数如何对应于“向右移动”数字(乘法向左移动)以及余数运算如何“屏蔽”除最低有效位之外的所有数字。

【讨论】:

    【解决方案2】:

    您可以将数字转换为字符串,然后通过循环遍历每个单独的字符来填充向量。

    #include <string>
    #include <vector>
    
    int a = 12345;
    std::string stringInt = std::to_string(a);
    
    std::vector<int> numbers;
    numbers.reserve(stringInt.length());
    
    for(const auto& chr : stringInt)
    {
      numbers.push_back(chr - '0');
    }
    

    这不涉及边缘情况或错误处理,由您来实现。

    【讨论】:

      【解决方案3】:

      您可以使用与将整数转换为字符串相同的方法,即

      std::vector<int> split;
      int integer = 12345;
      while( 0 != integer) {
        split.push_back( integer % 10 );
        integer /= 10;
      }
      std::reverse(split.begin(), split.end());
      

      【讨论】:

      【解决方案4】:

      这是我的代码。

      // num is input number
      void split(long long  num)
      {
          int i;
           vector<long long>  ve;
           ve.clear();
           while(num>0){
              long long rem=num%10;
              ve.pb(rem);
              num/=10;
           }
           //for output array
         reverse(ve.begin(),ve.end());
           for(i=0;i<ve.size();i++)
              cout<<ve[i]<<endl;
      
      
      }
      

      如果您有任何问题,请告诉我。

      【讨论】:

      • ve.pb -> ve.push_back。还有你为什么要在顶部声明int i,什么时候可以在for 语句中声明,为什么clear 是一个空的vector
      • 没有必要在long long向量中存储数字,范围无论如何都会是[-9..9],所以int就足够了(注意long long可以大于系统的内存总线,因此您可能需要多个操作来存储该值)。不需要clear() 一个全新的向量,无论如何它都是空的。相反,ve.reserve(19) 避免重新分配是有意义的,或者更好的是std::numeric_limits&lt;long long&gt;::max_digits10(至少理论上,long long 可能大于 64 位)。
      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多