卡拉兹Callatz猜想已经在1001中给出了描述。在这个题目里情况稍微有些复杂。当我们验证卡拉兹猜想的时候为了避免重复计算可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候我们需要计算 3、5、8、4、2、1则当我们对 n=5、8、4、2 进行验证的时候就可以直接判定卡拉兹猜想的真伪而不需要重复计算因为这 4 个数已经在验证3的时候遇到过了我们称 5、8、4、2 是被 3覆盖的数
你的代码有几个问题:
-
在定义数组
num的时候,你使用了变量n来指定数组的大小。然而,在大多数编译器中,变量n的值必须是一个常量,不能是一个变量。你可以使用动态内存分配来解决这个问题,或者使用一个足够大的固定大小的数组。 -
在计算卡拉兹猜想的过程中,你没有考虑到数组
Ca的大小。你需要确保Ca数组足够大,以容纳计算过程中的所有中间结果。在这里,你可以假设Ca数组的大小为100,但如果输入的数字很大,可能会导致数组越界。 -
在验证关键数字的过程中,你没有重置变量
sign的值。在每次验证新的数字之前,你应该将sign的值重置为0,以确保每个数字的覆盖情况是独立计算的。 -
在输出关键数字的循环中,你错误地递增了变量
key_count而不是m,导致循环永远无法结束。
以下是修正后的代码:
#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;
}
注意,我还在最后的输出循环中添加了一个空格,以便在输出关键数字时用空格分隔它们。你可以根据需要进行修改
原文地址: https://www.cveoy.top/t/topic/ijMm 著作权归作者所有。请勿转载和采集!