Number splitting

Viewed 76

So, my question is how to split the number into vector of its parts?

Example: n = 1000 => vector(1,0,0,0)

I came to this option:

#include <vector>
#include <cmath>
std::vector<int> split(int number)
{
    int n = number;
    int length = 0;
    while (n > 0)
    {
        length++;
        n /= 10;
    }
    std::vector<int> vec;
    for (int i = 0; i < length; ++i)
    {
        int degree1 = pow(10, length - i);
        int degree2 = pow(10, length - i - 1);
        vec.push_back(number % degree1 / degree2);
    }
    return vec;
}

However, I think there is a more appropriate way to do it

2 Answers

An even simpler way is to "print" the number into a std::string (e.g. with std::ostringstream or std::to_string()) and copy the characters one by one into your std::vector.

#include <iostream>
#include <sstream>
#include <vector>

std::vector<int> split(int number)
{
  std::vector<int> vec;
  if (number < 0) return vec;
  std::string text = std::to_string(number);
  for (char c : text) vec.push_back(c - '0');
  return vec;
}

std::ostream& operator<<(std::ostream &out, const std::vector<int> &vec)
{
  for (int i : vec) out << ' ' << i;
  return out;
}

int main()
{
  std::cout << "split(1000):" << split(1000) << '\n';
}

Output:

split(1000): 1 0 0 0

Live Demo on coliru

Another way is to use operator % (modulo, remainder). With % 10 you get the last digit. So, you can separate the digits from right to left. Either insert digits at beginning of vector or (better) push them back and std::reverse the final result.

Sample:

#include <algorithm>
#include <iostream>
#include <vector>

std::vector<int> split(int number)
{
  std::vector<int> vec;
  if (number >= 0) {
    do {
      vec.push_back(number % 10);
      number /= 10;
    } while (number);
    std::reverse(vec.begin(), vec.end());
  }
  return vec;
}

std::ostream& operator<<(std::ostream &out, const std::vector<int> &vec)
{
  for (int i : vec) out << ' ' << i;
  return out;
}

int main()
{
  std::cout << "split(1000):" << split(1000) << '\n';
}

Output:

split(1000): 1 0 0 0

Live Demo on coliru

A simpler way would be to push the digits into the vector in reverse order (using the n % 10 and n /= 10 operations), then call std::reverse() on the vector when done:

#include <vector>
#include <algorithm>

std::vector<int> split(int number)
{
    std::vector<int> vec;
    while (number > 0) {
        vec.push_back(number % 10);
        number /= 10;
    }
    std::reverse(vec.begin(), vec.end());
    return vec;
}
Related