Разбиение двойного в массив в C - PullRequest
0 голосов
/ 23 июня 2010

Я бы хотел, чтобы следующий код работал:

double num = 31415; /* num will never have a decimal part */
/* ... code here so that we can now say */
printf("%d", num_array[0] == 3 && num_array[1] == 1 && num_array[4] == 5); //1

Я понимаю, что это тривиально сделать с помощью целых чисел (просто int i=0; while(num>0) numarr[size-++i] = num%10, num/=10;, где размер задан как количество цифр в числе), но это, очевидно, не сработает для чисел с плавающей запятой / двойных чисел, потому что вы не можете мод с плавающей запятой.

И да, мне нужно использовать поплавки / двойные, несмотря на то, что я не использую секцию с плавающей запятой (это упражнение).

И я выяснил, как определить количество цифр в двойном числе, используя floor ().

/* n > 0, n=floor(n) */
int numdigits(double n){
    int i = 0;
    while (n >0)
        n = floor(n/10), i++;
    return i;
}

Ответы [ 3 ]

6 голосов
/ 23 июня 2010

Посмотрите вверх fmod.Число цифр, вероятно, будет легче вычислить, используя log10.

2 голосов
/ 23 июня 2010

Вероятно, проще всего преобразовать его в строку:

char* str = malloc(num_digits+1);
snprintf(str, num_digits+1, "%f", num);

Индексирование в str даст вам каждую цифру в виде значения ASCII, поэтому вам нужно будет вычесть '0', чтобы получитьфактическое числовое значение:

str[0] - '0' == 3;
str[1] - '0' == 1;
str[2] - '0' == 4;
...
0 голосов
/ 23 июня 2010

Помимо fmod (), вы также можете привести к int64_t или long long int и использовать%, как и раньше. Если диапазон меньше 10 цифр, вы можете использовать int32_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...