С++ получает каждую цифру в int

У меня есть целое число:

int iNums = 12476;

И теперь я хочу получить каждую цифру из iNums как целое. Что-то вроде:

foreach(iNum in iNums){
   printf("%i-", iNum);
}

Таким образом, выход будет: "1-2-4-7-6-". Но мне действительно нужна каждая цифра как int не как char.

Спасибо за помощь.

Ответ 1

int iNums = 12345;
int iNumsSize = 5;
for (int i=iNumsSize-1; i>=0; i--) {
    int y = pow(10, i);
    int z = iNums/y;
    int x2 = iNums / (y * 10);
    printf("%d-",z - x2*10 );
}

Ответ 2

void print_each_digit(int x)
{
    if(x >= 10)
       print_each_digit(x / 10);

    int digit = x % 10;

    std::cout << digit << '\n';
}

Ответ 3

Преобразовать его в строку, а затем перебрать символы. Для преобразования вы можете использовать std::ostringstream, например:

int iNums = 12476;
std::ostringstream os;

os << iNums;
std::string digits = os.str();

Btw обычно используемый термин (для того, что вы называете "числом" ) является "цифрой" - используйте его, так как заголовок вашего сообщения становится более понятным: -)

Ответ 4

Вот более общее, но рекурсивное решение, которое дает вектор цифр:

void collect_digits(std::vector<int>& digits, unsigned long num) {
    if (num > 9) {
        collect_digits(digits, num / 10);
    }
    digits.push_back(num % 10);
}

Поскольку существует относительно небольшое количество цифр, рекурсия аккуратно ограничена.

Ответ 5

Я не тестирую его, просто пишу, что у меня в голове. извините за любую ошибку синтаксиса

Вот онлайн-демонстрация ideone

vector <int> v; 

int i = ....
while(i != 0 ){
    cout << i%10 << " - "; // reverse order
    v.push_back(i%10); 
    i = i/10;
}

cout << endl;

for(int i=v.size()-1; i>=0; i--){
   cout << v[i] << " - "; // linear
}

Ответ 6

Вы можете сделать это с помощью этой функции:

void printDigits(int number) {
    if (number < 0) { // Handling negative number
        printf('-');
        number *= -1;
    }
    if (number == 0) { // Handling zero
        printf('0');
    }
    while (number > 0) { // Printing the number
        printf("%d-", number % 10);
        number /= 10;
    }
}

Ответ 7

Написанный с D.Shawley ответ, может пойти немного дальше, чтобы полностью ответить, выведя результат:

void stream_digits(std::ostream& output, int num, const std::string& delimiter = "")
{
    if (num) {
        stream_digits(output, num/10, delimiter);
        output << static_cast<char>('0' + (num % 10)) << delimiter;
    }
}

void splitDigits()
{
    int num = 12476;    
    stream_digits(std::cout, num, "-");    
    std::cout << std::endl;
}

Ответ 8

Я не знаю, будет ли это быстрее или медленнее или бесполезно, но это будет альтернативой:

int iNums = 12476;
string numString;
stringstream ss;
ss << iNums;
numString = ss.str();
for (int i = 0; i < numString.length(); i++) {
    int myInt = static_cast<int>(numString[i] - '0'); // '0' = 48
    printf("%i-", myInt);
}

Я указываю на это, поскольку iNums ссылается на возможность ввода пользователем, и если пользовательский ввод был строкой в ​​первую очередь, вам не нужно было бы перебирать проблему преобразования int в строку.

(to_string может использоваться в С++ 11)

Ответ 9

На основе ответа @Abyx, но использует div, так что на каждую цифру делается только 1 деление.

#include <cstdlib>
#include <iostream>

void print_each_digit(int x)
{
    div_t q = div(x, 10);

    if (q.quot)
        print_each_digit(q.quot);

    std::cout << q.rem << '-';
}

int main()
{
    print_each_digit(12476);
    std::cout << std::endl;
    return 0;
}

Вывод:

1-2-4-7-6-

N.B. Работает только для неотрицательных ints.

Ответ 10

Чтобы получить цифру в позиции "pos" (начиная с позиции 1 как наименее значимая цифра (LSD)):

digit = (int)(number/pow(10,(pos-1))) % 10;

Пример: number = 57820 → pos = 4 → digit = 7


Чтобы последовательно получить цифры:

int num_digits = floor( log10(abs(number?number:1)) + 1 );
for(; num_digits; num_digits--, number/=10) {
    std::cout << number % 10 << " ";
}

Пример: номер = 57820 → вывод: 0 2 8 7 5

Ответ 11

Мое решение:

void getSumDigits(int n) {
    std::vector<int> int_to_vec;
    while(n>0)
    {
        int_to_vec.push_back(n%10);
        n=n/10;
    }

    int sum;

    for(int i=0;i<int_to_vec.size();i++)
    {
        sum+=int_to_vec.at(i);

    }
    std::cout << sum << ' ';
}

Ответ 12

Ответ, который я использовал, - это простая функция:

int getDigit(int n, int position) {

    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1))) / (int)pow(10, position-1);

}

Надеюсь, что кто-то найдет это полезным!

Ответ 13

Я знаю, что это старый пост, но все эти ответы были неприемлемы для меня, поэтому я написал свои собственные!

Моя цель состояла в том, чтобы отобразить число на экран, следовательно, имена функций.

void RenderNumber(int to_print)
{
    if (to_print < 0)
    {
        RenderMinusSign()
        RenderNumber(-to_print);
    }
    else
    {
        int digits = 1; // Assume if 0 is entered we want to print 0 (i.e. minimum of 1 digit)
        int max = 10;

        while (to_print >= max) // find how many digits the number is 
        {
            max *= 10;
            digits ++;
        }

        for (int i = 0; i < digits; i++) // loop through each digit
        {
            max /= 10;
            int num = to_print / max; // isolate first digit
            to_print -= num * max; // subtract first digit from number
            RenderDigit(num);
        }
    }
}