gpt4 book ai didi

c - 如何在 C 语言的 Collat​​z 猜想程序中减少数字

转载 作者:行者123 更新时间:2023-11-30 20:11:11 25 4
gpt4 key购买 nike

目前我正在用 C 语言实现 Collat​​z 猜想问题。我能够打印特定数字的系列。例如,如果数字是 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 = 2424 是系列中的元素数量。现在我想打印系列号直到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 语言的 Collat​​z 猜想程序中减少数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com