C语言代码优化:解决数组长度问题
#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()函数来释放已分配的内存。
原文地址: https://www.cveoy.top/t/topic/p1U1 著作权归作者所有。请勿转载和采集!