Getting each individual digit from a whole integer

后端 未结 9 1178
南方客
南方客 2020-11-30 04:05

Let\'s say I have an integer called \'score\', that looks like this:

int score = 1529587;

Now what I want to do is get each digit 1, 5, 2,

相关标签:
9条回答
  • 2020-11-30 04:38

    Agree with previous answers.

    A little correction: There's a better way to print the decimal digits from left to right, without allocating extra buffer. In addition you may want to display a zero characeter if the score is 0 (the loop suggested in the previous answers won't print anythng).

    This demands an additional pass:

    int div;
    for (div = 1; div <= score; div *= 10)
        ;
    
    do
    {
        div /= 10;
        printf("%d\n", score / div);
        score %= div;
    } while (score);
    
    0 讨论(0)
  • 2020-11-30 04:51

    You use the modulo operator:

    while(score)
    {
        printf("%d\n", score % 10);
        score /= 10;
    }
    

    Note that this will give you the digits in reverse order (i.e. least significant digit first). If you want the most significant digit first, you'll have to store the digits in an array, then read them out in reverse order.

    0 讨论(0)
  • 2020-11-30 04:51

    Usually, this problem resolve with using the modulo of a number in a loop or convert a number to a string. For convert a number to a string, you may can use the function itoa, so considering the variant with the modulo of a number in a loop.


    Content of a file get_digits.c

    $ cat get_digits.c 
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    
    // return a length of integer
    unsigned long int get_number_count_digits(long int number);
    
    // get digits from an integer number into an array
    int number_get_digits(long int number, int **digits, unsigned int *len);
    
    // for demo features
    void demo_number_get_digits(long int number);
    
    
    int
    main()
    {
        demo_number_get_digits(-9999999999999);
        demo_number_get_digits(-10000000000);
        demo_number_get_digits(-1000);
        demo_number_get_digits(-9);
        demo_number_get_digits(0);
        demo_number_get_digits(9);
        demo_number_get_digits(1000);
        demo_number_get_digits(10000000000);
        demo_number_get_digits(9999999999999);
        return EXIT_SUCCESS;
    }
    
    
    unsigned long int
    get_number_count_digits(long int number)
    {
        if (number < 0)
            number = llabs(number);
        else if (number == 0)
            return 1;
    
        if (number < 999999999999997)
            return floor(log10(number)) + 1;
    
        unsigned long int count = 0;
        while (number > 0) {
            ++count;
            number /= 10;
        }
        return count;
    }
    
    
    int
    number_get_digits(long int number, int **digits, unsigned int *len)
    {
        number = labs(number);
    
        // termination count digits and size of a array as well as
        *len = get_number_count_digits(number);
    
        *digits = realloc(*digits, *len * sizeof(int));
    
        // fill up the array
        unsigned int index = 0;
        while (number > 0) {
            (*digits)[index] = (int)(number % 10);
            number /= 10;
            ++index;
        }
    
        // reverse the array
        unsigned long int i = 0, half_len = (*len / 2);
        int swap;
        while (i < half_len) {
            swap = (*digits)[i];
            (*digits)[i] = (*digits)[*len - i - 1];
            (*digits)[*len - i - 1] = swap;
             ++i;
        }
    
        return 0;
    }
    
    
    void
    demo_number_get_digits(long int number)
    {
        int *digits;
        unsigned int len;
    
        digits = malloc(sizeof(int));
    
        number_get_digits(number, &digits, &len);
    
        printf("%ld --> [", number);
        for (unsigned int i = 0; i < len; ++i) {
            if (i == len - 1)
                printf("%d", digits[i]);
            else
                printf("%d, ", digits[i]);
        }
        printf("]\n");
    
        free(digits);
    }
    

    Demo with the GNU GCC

    $~/Downloads/temp$ cc -Wall -Wextra -std=c11 -o run get_digits.c -lm
    $~/Downloads/temp$ ./run
    -9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
    -10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    -1000 --> [1, 0, 0, 0]
    -9 --> [9]
    0 --> [0]
    9 --> [9]
    1000 --> [1, 0, 0, 0]
    10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
    

    Demo with the LLVM/Clang

    $~/Downloads/temp$ rm run
    $~/Downloads/temp$ clang -std=c11 -Wall -Wextra get_digits.c -o run -lm
    setivolkylany$~/Downloads/temp$ ./run
    -9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
    -10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    -1000 --> [1, 0, 0, 0]
    -9 --> [9]
    0 --> [0]
    9 --> [9]
    1000 --> [1, 0, 0, 0]
    10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
    

    Testing environment

    $~/Downloads/temp$ cc --version | head -n 1
    cc (Debian 4.9.2-10) 4.9.2
    $~/Downloads/temp$ clang --version
    Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
    Target: x86_64-pc-linux-gnu
    Thread model: posix
    
    0 讨论(0)
提交回复
热议问题