Получение отдельных цифр и целых чисел - программирование на C

Я пытаюсь разбить число и получить каждую отдельную цифру. Я пытаюсь сделать это путем деления на степени десяти, пока не достигну 0. Каждый раз, когда я делю на десять, это добавляет к общему количеству цифр в целом числе. Как только у меня будет общее количество цифр, я разделю исходную цифру на 10 на количество цифр - 1, а затем уменьшу количество цифр и повторю процесс. Это работает до последней цифры, где я получаю 4 вместо 6. Я пытался использовать другой номер, и последние, а иногда и предпоследние цифры были неправильными. Есть ли какая-либо причина, почему это происходит, и любая помощь будет оценена по достоинству.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int indx;
    int originalDigit = 1234;
    int numDigits;
    int digit;
    int individualDigit;

    numDigits = 0;

    digit = originalDigit;

    while(digit > 0)
    {
        digit = digit / 10;
        numDigits++;

    }

    printf("%d\n", numDigits);

    digit = originalDigit;
    while( digit > 0)
    {
        individualDigit = digit / (int)pow(10, numDigits - 1);

        printf("%d ", individualDigit);
        digit = digit % (int)pow(10, numDigits - 1);
        numDigits--;
    }

    return 0;
}

person Jack Swanson    schedule 02.08.2015    source источник
comment
Альтернатива: sprintf в буфер char достаточного размера. Вы получаете (а) цифры в виде символов и (б) количество цифр через strlen().   -  person WhozCraig    schedule 02.08.2015
comment
Я считаю, что мне нужно указать, сколько переменных мне нужно распечатать. Задача, которую я пытаюсь выполнить, — найти значения от 99999 до 0, где сумма каждого факториала отдельных цифр равна числу. Мой подход состоит в том, чтобы разбить число, использовать факториал и сложить сумму. Я должен постоянно делать это в цикле, который я предполагаю, и я не знаю, как я смогу сделать это с помощью sprintf.   -  person Jack Swanson    schedule 02.08.2015
comment
Не могу открыть ссылку, Сурав.   -  person Jack Swanson    schedule 02.08.2015
comment
@RichardFlores Я не понимаю, вы хотите, чтобы этот номер 1234 был разбит на 1 2 3 4 ?   -  person ameyCU    schedule 02.08.2015
comment
(ideone.com/5cvqX7) попробуйте это.   -  person Sourav Kanta    schedule 02.08.2015
comment
Да, это то, что я хочу сделать.   -  person Jack Swanson    schedule 02.08.2015
comment
Всякий раз, когда я запускаю этот код, я получаю результат; 5 1 2 3 5 3 Есть ли причина, по которой мы должны получить два разных результата?   -  person Jack Swanson    schedule 02.08.2015


Ответы (1)


Я бы не стал использовать функции с плавающей запятой, такие как pow, когда есть отличные способы сделать это с помощью целочисленной математики.

Одним из решений является просто sprintf число в буфер, затем вы можете использовать strlen для получения количества цифр и отдельных символов для получения цифр:

void method1 (int val) {
    char buff[50];
    sprintf (buff, "%d", val);
    printf ("Digit count = %d, digits =", strlen (buff));
    for (int i = 0; i < strlen (buff); i++)
        printf (" %c", buff[i]);
    putchar ('\n');
}

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

void method2 (int val) {
    int len, buff[50];
    for (len = 0; val > 0; len++, val /= 10)
        buff[len] = val % 10;

    // Logical swap.

    printf ("Digit count = %d, digits =", len);
    for (int i = len - 1; i >= 0; i--)
        printf (" %d", buff[i]);
    putchar ('\n');
}

void method3 (int val) {
    int len, buff[50];
    for (len = 0; val > 0; len++, val /= 10)
        buff[len] = val % 10;

    // Pyhsical swap.

    for (int i = 0, j = len - 1; i < j; i++, j--) {
        int t = buff[i];
        buff[i] = buff[j];
        buff[j] = t;
    }

    printf ("Digit count = %d, digits =", len);
    for (int i = 0; i < len; i++)
        printf (" %d", buff[i]);
    putchar ('\n');
}
person paxdiablo    schedule 02.08.2015