将整数转换为数组

22

我想将一个整数转换为数组,使其看起来像下面这样:

int number = 123456 ;
int array[7] ;

得到的结果是:

array[0] = 1 
array[1] = 2
...
array[6] = 6

这是一份作业,但我会尽力完成。直到我向妻子解释之前,她并没有真正理解这个问题。 - Broam
10
你的“...”出了问题。 数组有7个成员,但数字中只有6个小数位。 - Steve Jessop
13个回答

30

也许更好的解决方案是倒推:

123456 % 10 = 6

123456 / 10 = 12345

12345 % 10 = 5

12345 / 10 = 1234


18

只需使用模运算:

int array[6];
int number = 123456;
for (int i = 5; i >= 0; i--) {
    array[i] = number % 10;
    number /= 10;
}

6
怎么样给一个解释实际上解释了方法,这样OP就能学到东西了呢? - jalf
1
这只能在6位非负整数上正常工作。 - Drew Dormann
1
我希望原帖作者思考如何扩展它以处理其他数字,而不仅仅是提供一般情况。 - user224003

7

我给出了以下代码,integerToArray 函数返回一个从整数值转换而来的向量。您也可以使用 main 函数进行测试:

#include <iostream>
#include <vector>
using namespace std;

vector <int> integerToArray(int x)
{
    vector <int> resultArray;
    while (true)
    {
    resultArray.insert(resultArray.begin(), x%10);
    x /= 10;
    if(x == 0)
        return resultArray;
    }
}

int main()
{
    vector <int> temp = integerToArray(1234567);
    for (auto const &element : temp)
        cout << element << " " ;
    return 0;
}

//outputs 1 2 3 4 5 6 7 

6

您可以通过以下方式提取数字的最后一位:

int digit = number % 10;
number /= 10;

请注意,您还应检查number是否为正数。其他值需要额外处理。

这两种方法是做同样事情的不同方式吗? - mLstudent33

2

取该数字的log10以获取数字的位数。将其放在变量pos中,然后,在循环中,取10的模数(n % 10),将结果放入数组的pos位置中。将pos减1并将数字除以10。重复此操作直到pos == 0

如果数字是负数,你希望对符号做什么?


1
#include <cmath>
#include <vector>    

std::vector<int> vec;
for (int i = log10(input); i >= 0; i--)
{
  vec.push_back(input / int(std::pow(10, i)) % 10);
}

可能是一个不错的方法,我认为。

0

将整数转换为数组,您可以执行以下步骤:

  • 获取要转换为数组的数字中的总位数。为此,我们将使用count_digits()函数,该函数将在忽略前导零后返回总位数。
digits = count_digits(n);

现在我们将为我们的结果数组动态分配内存,就像这样。
int* arr = new int[count_digits(n)]

分配内存后,我们将使用下面的for循环填充数组。
int digits = count_digits(num);
for (int i = digits; i > 0; i--){
    arr[i-1] = num % 10;
    num = num / 10;
}

在执行上述步骤后,我们将能够将整数转换为数组。请记住,num是我们想要转换为数组的数字,而digits是变量,它给出了一个给定数字中零前导数字的数量。

0

如果这真的是作业,那就给老师看看吧 - 只是为了好玩 ;-)

注意!性能非常差,达到您期望的效果的方法笨拙且通常不要在家里(工作)这样做;-)

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

typedef std::vector< int > ints_t;

struct digit2int
{
    int operator()( const char chr ) const
    {
        const int result = chr - '0';
        return result;
    }
};

void foo( const int number, ints_t* result )
{
    std::ostringstream os;
    os << number;
    const std::string& numberStr = os.str();
    std::transform(
        numberStr.begin(),
        numberStr.end(),
        std::back_inserter( *result ),
        digit2int() );
}

int main()
{
    ints_t array;
    foo( 123456, &array );
    std::copy(
        array.begin(),
        array.end(),
        std::ostream_iterator< int >( std::cout, "\n" ) );
}

0
如果你想把它转换成字符串,那么非常容易,只需按照其他人使用%操作符的方式即可: 假设num = 123,我们可以这样做:
string str;
while (num > 0)
{
   str = (num % 10) + str;  //put last digit and put it into the beginning of the string
   num = num /10;  //strip out the last digit
}

现在你可以将str用作字符数组。使用数组会很麻烦,因为将东西放在数组的开头需要你移动其他所有元素。我们可以做的是,不是将每个数字放入一个字符串中,而是将其放入一个堆栈中。它会以相反的顺序放置,如:3 2 1。然后我们可以逐个弹出顶部数字,并按正确的顺序将其放入数组中。你的数组将看起来像这样:1 2 3。我会把实现留给你,因为这是一项作业。
@Broam有一个很好的解决方案,但正如他所说,它是用于向后工作的。我认为OP或任何查看此线程的人都希望它向前工作,这就是为什么我发布这篇文章的原因。如果你有更好的解决方案,请回复,我也很感兴趣。

0

我现在能想到的最简单的方法是:

char array[40];
int number = 123456;

memset(array, 0x00, sizeof(array));

sprintf(array, "%d", number);

此外,您可以通过将字符值减去0x30来将每个数字转换为int。
编辑:如果这是一项作业,您的老师可能会要求您使用%运算符编写程序(例如12%10 = 2)。如果是这种情况,那么这是一份好作业。;-)

那是一个字符数组,不是整数数组。 - catchmeifyoutry
如果你要使用sprintf,请至少使用snprintf。 - philsquared
我知道这是一个字符数组,但是你可以通过将字符值减去0x30来轻松地转换为整数,就像我在答案中观察到的那样。snprintf不是C标准。 - Andres
@Andres - snprintf 是标准的 C99,将被包含在 C++/1x 中,并且现在在大多数 C++ 编译器中作为常见扩展可用。 - philsquared
太好了,知道了@Phil。我这么说是因为我曾经尝试在Unix的一些项目中使用它,但我们使用的编译器不支持它。 - Andres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接