#include <stdio.h>

int main() { int n = 0; int i = 0; int key_count = 0;

scanf("%d", &n); int num[n]; int Ca[100]; int key[100];

for (i = 0; i < n; i++) { scanf("%d", &num[i]); int buf = num[i]; int count = 0;

while (buf != 1) {
  if (buf % 2 == 0) {
    buf = buf / 2;
    Ca[count] = buf;
    count++;
  } else {
    buf = (3 * buf + 1) / 2;
    Ca[count] = buf;
    count++;
  }
}

int sign = 0; // 重置 sign 的值

for (int j = 0; j < count; j++) {
  int compare = Ca[j];

  for (int k = 0; k < n; k++) {
    if (compare == num[k]) {
      sign++;
    }
  }
}

if (sign == (n - 1)) {
  key[key_count] = num[i];
  key_count++;
}

}

for (int m = 0; m < key_count; m++) { printf("%d ", key[m]); }

return 0; } 哪里有错误内容:在这段代码中,没有明确指定数组的长度,这是不合法的。在C语言中,数组的长度必须是一个常量表达式。

你可以使用动态内存分配来解决这个问题,或者使用一个足够大的数组来存储输入的值。

以下是使用动态内存分配的修复代码:

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

int main() {
  int n = 0;
  int i = 0;
  int key_count = 0;

  scanf("%d", &n);
  int* num = (int*)malloc(n * sizeof(int));
  int* Ca = (int*)malloc(100 * sizeof(int));
  int* key = (int*)malloc(100 * sizeof(int));

  for (i = 0; i < n; i++) {
    scanf("%d", &num[i]);
    int buf = num[i];
    int count = 0;

    while (buf != 1) {
      if (buf % 2 == 0) {
        buf = buf / 2;
        Ca[count] = buf;
        count++;
      } else {
        buf = (3 * buf + 1) / 2;
        Ca[count] = buf;
        count++;
      }
    }

    int sign = 0; // 重置 sign 的值

    for (int j = 0; j < count; j++) {
      int compare = Ca[j];

      for (int k = 0; k < n; k++) {
        if (compare == num[k]) {
          sign++;
        }
      }
    }

    if (sign == (n - 1)) {
      key[key_count] = num[i];
      key_count++;
    }
  }

  for (int m = 0; m < key_count; m++) {
    printf("%d ", key[m]);
  }

  free(num);
  free(Ca);
  free(key);

  return 0;
}

请注意,使用动态内存分配后,需要在程序结束时使用free()函数来释放已分配的内存。

C语言代码优化:解决数组长度问题

原文地址: https://www.cveoy.top/t/topic/p1U1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录