2

所以,我的问题是如何将数字拆分为其部分的向量?

示例:n = 1000 => 向量(1,0,0,0)

我来到了这个选项:

#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;
}

但是,我认为有一种更合适的方法来做到这一点

4

2 回答 2

3

一种更简单的方法是将数字“打印”到 a 中std::string(例如使用std::ostringstreamor std::to_string())并将字符一个接一个地复制到您的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';
}

输出:

split(1000): 1 0 0 0

coliru 现场演示

另一种方法是使用operator %(模数,余数)。随着% 10你得到最后一个数字。因此,您可以将数字从右到左分开。在向量的开头插入数字或(更好)将它们推回并std::reverse最终结果。

样本:

#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';
}

输出:

split(1000): 1 0 0 0

coliru 现场演示

于 2020-06-01T06:58:41.577 回答
1

一种更简单的方法是将数字以相反的顺序推入向量中(使用n % 10andn /= 10操作),然后std::reverse()在完成后调用向量:

#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;
}
于 2020-06-01T06:56:50.803 回答