динамический массив против обычного массива, чтобы найти константу Капрекара с использованием языка Си - PullRequest
0 голосов
/ 18 сентября 2018

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

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

#define size 4

void KaprekarsConstant(int num) {
    //int *arr;
    int j, i, temp, sorted, counter = 0, rev;
    while (num != 6174) {
        int arr[3] = { 0 };
        //arr = (int*)calloc((size - 1), sizeof(int));
        for (i = 0; num != 0; i++) {
            arr[i] = num % 10;
            num /= 10;
        }
        for (i = 1; i < size; i++) {
            for (j = i - 1, temp = arr[i]; (temp < arr[j]) && (j >= 0); j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp;
            j++;
        }
        for (i = 0, sorted = 0; i < size; i++) {
            sorted = arr[i] + (sorted * 10);
        }
        for (i = size - 1, rev = 0; i >= 0; i--) {
            rev = arr[i] + (rev * 10);
        }
        num = abs(rev - sorted);
        counter++;
    }
    //free(arr);
    printf("%d\n", counter);
}

int main(void) {
    KaprekarsConstant(2111); //print 5
    return 0;
}

1 Ответ

0 голосов
/ 18 сентября 2018

Ваш код имеет неопределенное поведение в обоих случаях, потому что вы получаете доступ и изменяете arr за его пределами: arr определяется или выделяется с размером 3, но вы получаете доступ и изменяете arr[3], который является четвертым элементом .

Чрезвычайно подвержен ошибкам переопределение идентификатора size в качестве макроса. Вы должны хотя бы использовать SIZE или NUMBER_SIZE.

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