目前我正在用 C 语言实现 Collatz 猜想问题。我能够打印特定数字的系列。例如,如果数字是 25
则系列类似于 25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 = 24
。 24
是系列中的元素数量。现在我想打印系列号直到1
。例如 25,24,...
到 1
。
这是我尝试过的:
#include <stdio.h>
int main() {
long x, a = 0;
printf("Enter the value of X:");
scanf("%lu", &x);
printf("%ld ", x);
for (i = x * x; i >= 1; i--) {
if (x % 2 == 0) {
x = x / 2;
printf("%lu ", x);
if (x == 1) {
break;
}
} else {
x = (3 * x) + 1;
printf("%lu ", x);
if (x == 1) {
break;
}
}
a++;
}
printf(" = %lu\n", a + 2);
return 0;
}
请帮我解决这个问题。
最佳答案
您应该添加一个额外的循环以从 x
进行迭代降至 1
.
请注意,您的代码对于值 1
无法正常工作并且不计算正确位置的输出数量,导致令人惊讶的 + 2
最终调整。
将代码移至单独的函数可以提高可读性。
你的保护循环没有意义:在 x * x
之后停止迭代假设 x * x
范围为unsigned long
,该值可能非常低(Windows 上为 x < 65536
)。较大的值可能会给出不正确的结果。只需删除防护测试就可以简化代码,如果我们假设 Collatz conjecture为真(已针对最高 260 的所有起始值进行了测试)任何产生无限循环的计数器示例都将受到欢迎。
这是一个简化和扩展的版本:
#include <stdio.h>
int main(void) {
unsigned long xx, x, a;
printf("Enter the value of X: ");
if (scanf("%lu", &xx) != 1)
return 1;
for (; xx >= 1; xx--) {
x = xx;
a = 0;
for (;;) {
printf("%lu ", x);
a++;
if (x == 1)
break;
if (x % 2 == 0) {
x = x / 2;
} else {
x = (3 * x) + 1;
}
}
printf("= %lu\n", a);
}
return 0;
}
关于c - 如何在 C 语言的 Collatz 猜想程序中减少数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018766/