C: как разбить многозначное число на отдельные переменные?

Скажем, у меня есть многозначное целое число в C. Я хочу разбить его на однозначные целые числа.

123 превратится в 1, 2 и 3.

Как я могу это сделать, особенно если я не знаю, сколько цифр имеет целое число?


person mugetsu    schedule 15.02.2012    source источник
comment
Если ваш int начал жизнь как данные char (ввод от пользователя или текстового файла...), не преобразовывайте в int в первую очередь (без scanf, без atoi...) и используйте символы для разделения цифр.   -  person pmg    schedule 16.02.2012


Ответы (9)


Сначала посчитаем цифры:

unsigned int count(unsigned int i) {
 unsigned int ret=1;
 while (i/=10) ret++;
 return ret;
}

Затем вы можете сохранить их в массиве:

unsigned int num=123; //for example
unsigned int dig=count(num);
char arr[dig];
while (dig--) {
 arr[dig]=num%10;
 num/=10;
}
person asaelr    schedule 15.02.2012

Подсказка: получить n-ю цифру в числе довольно просто; разделить на 10 n раз, затем по модулю 10, или в C:

int nthdig(int n, int k){
     while(n--)
         k/=10;
     return k%10;
}
person Dave    schedule 15.02.2012
comment
это не n-е цифры, это n-е цифры, начиная с младшего значащего - person MK.; 16.02.2012
comment
Вы не считаете младшую значащую цифру нулем? - person Dave; 16.02.2012
comment
ну, я считаю, что первая или нулевая цифры числа 123 равны 1, а не 3. - person MK.; 16.02.2012

Последние цифры числа 123 равны 123 % 10. Вы можете отбросить последнюю цифру числа 123, выполнив 123/10 — при целочисленном делении это даст вам 12. Чтобы ответить на ваш вопрос о том, «как мне узнать, сколько у вас цифр» -- попробуйте сделать это, как описано выше, и вы увидите, как понять, когда нужно остановиться.

person MK.    schedule 15.02.2012

Я думаю, что приведенный ниже фрагмент кода поможет....

temp = num;
while(temp)
{
    temp=temp/10;
    factor = factor*10;
}

printf("\n%d\n", factor);
printf("Each digits of given number are:\n");

while(factor>1)
{
    factor = factor/10;
    printf("%d\t",num/factor);
    i++;
    num = num % factor;
}
person Atul Khanduri    schedule 01.11.2013

//Based on Tony's answer
#include <stdio.h> 
int nthdig(int n, int k){
    while(n--)
        k/=10;
    return k%10;
}

int main() {
    int numberToSplit = 987;
    printf("Hundreds = %i\n",nthdig(2, numberToSplit));
    printf("Tens     = %i\n",nthdig(1, numberToSplit));
    printf("Units    = %i\n",nthdig(0, numberToSplit));
}

В результате получается следующая распечатка:

Сотни = 9

Десятки = 8

Единицы = 7

person Rupert Russell    schedule 17.04.2017

Я сделал это на основе кода @asaelr:

typedef struct digitsArrayPlusNumber {
    uint32_t *baseAddress;
    uint32_t number;
} digitsArrayPlusNumber;

digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
    // based on code from [email protected]

    uint32_t inputValue = inValue;

    //Count digits

    uint32_t theCount = 1;
    while (inputValue /= 10)
        theCount++;

    // put in array
    uint32_t *arr = malloc(sizeof(uint32_t) * theCount);
    uint32_t dig = theCount;
    while (dig--) {
        arr[dig]=inValue % 10;
        inValue /= 10;
        //  printf ("%d\n", arr[dig]);
    }

    digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber));

    dandn->baseAddress = arr;
    dandn->number = theCount;

    return dandn;

}

int main(int argc, const char * argv[]) {


    for (int d = 0; d < splitDigits(12345678)->number; d++)
        printf ("%u\n", (splitDigits(12345678)->baseAddress)[d]);

}

Это работает довольно хорошо, спасибо!

person Laserbeak    schedule 17.06.2017

Вы можете использовать %10, что означает остаток от числа после его деления. Итак, 123 % 10 равно 3, потому что остаток равен 3, вычтите 3 из 123, тогда получится 120, затем разделите 120 на 10, что равно 12. И проделайте тот же процесс.

person Community    schedule 21.12.2017

мы можем использовать эту программу как функцию с 3 аргументами. Здесь в «пока (a ++ ‹ 2)» 2 - это количество цифр, которое вам нужно (можно указать как один аргумент), замените 2 цифрами, которые вам нужны. Здесь мы можем использовать «z/=pow(10,6)», если нам не нужны последние определенные цифры, замените 6 на количество цифр, которые вам не нужны (можно указать в качестве другого аргумента), а третий аргумент номер, который нужно сломать.

int main(){
long signed c=0,z,a=0,b=1,d=1;
scanf("%ld",&z);
while(a++<2){
       if(d++==1) 
       z/=pow(10,6);
       c+=(z%10)*b; 
       z/=10;
       b*=10;}
        return c;}
person Siddarth Sid    schedule 13.09.2015
comment
Никогда не используйте pow для этого - person Antti Haapala; 14.01.2020

Вы можете разделять и властвовать, но вам придется переписать все арифметические библиотеки. Я предлагаю использовать многоточную библиотеку https://gmplib.org. Но, конечно, это хорошая практика.

person Develooper    schedule 15.09.2017