C: как разбить многозначное число на отдельные переменные? - PullRequest
23 голосов
/ 16 февраля 2012

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

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

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

Ответы [ 12 ]

31 голосов
/ 16 февраля 2012
int value = 123;
while (value > 0) {
 int digit = value % 10;
 // do something with digit
 value /= 10;
}
7 голосов
/ 16 февраля 2012

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

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 голос
/ 16 февраля 2012

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

int nthdig(int n, int k){
     while(n--)
         k/=10;
     return k%10;
}
0 голосов
/ 24 марта 2019
int l1; //123456 for example
scanf("%d",&l1);
char s[sizeof(l1)];
sprintf(s,"%5d",l1);'

//This will give you separate digits of the number in char format inside s[0],s[1] 
//and so on.

//If you want them in int format, declare a int array say int i[sizeof(l1)] and add 
//the following code

for(int c=1;c<=sizeof(l1);c++){
i[c] = s[c] - '0';
} 

//Now i[0], i[1] etc will have the digits in int format
0 голосов
/ 22 декабря 2017

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

0 голосов
/ 16 сентября 2017

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

0 голосов
/ 17 июня 2017

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

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

digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
    // based on code from asaelr@stackoverflow.com

    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]);

}

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

0 голосов
/ 18 апреля 2017
//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 голосов
/ 13 сентября 2015

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

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 голосов
/ 23 мая 2015

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

//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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...