动态数组与普通数组使用 C 语言查找 Kaprekar 常量



以下程序打印到达卡普雷卡斯的时间数 不断 我不明白为什么当我使用普通数组时它会在无限循环上运行 当我使用我在评论中写的动态数组时它可以工作。

#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("%dn", counter);
}
int main(void) {
KaprekarsConstant(2111); //print 5
return 0;
}

您的代码在这两种情况下都有未定义的行为,因为您访问和修改arr超出了其边界:arr定义或分配的大小为3,但您可以访问和修改arr[3]这是第四个元素。

将标识符size重新定义为宏是非常容易出错的。您至少应该使用SIZENUMBER_SIZE.

最新更新