Использование fmod () в C всегда приводит к нулю (0) - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь разбить 16-значный номер на цифры. Использование unsigned long int и % не работает, поскольку переменная этого типа поддерживает только числа, меньшие 4.294.967.295. Поэтому я адаптировал код и использовал fmod вместо %, но теперь единственный результат, который я получаю - ноль.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>

int main() {
    setlocale(LC_ALL, "");

    double num, digit;
    int i;

    printf("Enter the 16-digit number: ");
    scanf("%lf", &num);

    for (i = 1; num > 0; i++) {
        printf("%d - ", i);
        digit = fmod(num, 10.0);
        printf("%.2lf   ", digit);

        num /= 10.0;
        printf("%.2f\n", num);
    }
}

Что я делаю не так?

1 Ответ

1 голос
/ 11 марта 2020

fmod не является правильным инструментом для обработки больших целых чисел, а также не является типом double, если вы хотите sh, чтобы иметь точные цифры. Тип unsigned long int может действительно быть недостаточно большим для чисел, таких как 10 16 , в зависимости от целевой архитектуры, особенно в устаревших системах, где тип long имеет только 32 бита даже в 64-битном режиме.

Вы должны использовать тип unsigned long long int, который гарантированно имеет не менее 64 битов значения, что более чем достаточно для больших целых чисел:

#include <stdio.h>
#include <stdlib.h>

int main() {
    unsigned long long num;
    int i, digit;

    printf("Enter the 16-digit number: ");
    if (scanf("%llu", &num) == 1) {
        for (i = 1; num > 0; i++) {
            printf("%d - ", i);
            digit = num % 10;
            printf("%d   ", digit);
            num /= 10;
            printf("%llu\n", num);
        }
    }
    return 0;
}
...