2012-02-15 6 views
19

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

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

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

+0

Разделить и остаток. –

+0

Десятичные цифры означают '% 10'. –

+2

Если ваш int начал жизнь как данные 'char' (ввод от пользователя или текстового файла ...), сначала не конвертируйте в int (нет' scanf', no 'atoi' ...) и используйте символы для разделить цифры. – pmg

ответ

27
int value = 123; 
while (value > 0) { 
int digit = value % 10; 
// do something with digit 
value /= 10; 
} 
+5

этот алгоритм выдает цифры в обратном порядке ... – Matze

2

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

int nthdig(int n, int k){ 
    while(n--) 
     k/=10; 
    return k%10; 
} 
+0

Это не n-ые цифры, это n-ые цифры, начиная с наименее значимых –

+0

Вы не считаете наименее значимую цифру нулевой? – Dave

+3

ну, я считаю, что первые или нулевые цифры 123 равны 1, а не 3. –

0

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

5

Во-первых, кол-во цифр:

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; 
} 
+1

Лучше пример, то текущий ответ, спасибо – moffeltje

0

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

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

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

//Separate number digits 
#include <stdio.h> 
#include <math.h> 

void main() 
{ 
    int x, y, n = 0; 

    scanf("%d", &x); 

    //counting digits 
    y = x; 
    while (y != 0) 
    { 
     n += 1; 
     y /= 10; 
    } 

    //printing separated digits 
    int i; 
    for (i = ceil(pow(10, (n - 1))); i != 0; i /= 10) 
     printf("%d ", (x/i) % 10); 
} 
0

мы можем использовать эту программу в качестве функции с 3 arguments.Here в «в то время как (а ++ < 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;} 
0
//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

0

Я сделал это на основе кода из @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]); 

} 

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

-1

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

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Из обзора] (/ review/low-quality-posts/17348132) – teppic

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/17348132) – primpap

0

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