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

标签 c loops

目前我正在用 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/

相关文章:

使用 scanf() 检查 C 中的用户输入

C 两个函数合二为一

cudaHostRegister 在计算能力为 1.1 的 GPU 上返回 cudaErrorInvalidValue

java - 接受一系列数字? for循环

javascript - 使用 javascript 迭代子对象并获取所有值

javascript - 如何在React JS中设置两个循环

C编程open()调用路径

c - 在这个 for 循环中将调用 strlen() 多少次?

python - 我想生成一个循环来查找多列的 groupby 平均值

php - 'simplexml' php 到 mysql 数据库循环只返回第一个元素