簡體   English   中英

如何在 C 中的 Collat​​z 猜想程序中減少數字

[英]How can I decrement numbers in Collatz conjecture program in C

目前我正在用 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 = 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;
}

請幫我解決這個問題。

一個好主意是為函數中的 1 個元素使用 Collat​​z 函數。 此函數將采用元素的參數,例如 25,然后打印 25 的 collat​​z 系列。

然后,您可以圍繞該函數運行一個循環,使用參數 24、23、22 等調用它。這將為所有這些數字提供 collat​​z 系列。

我沒有給出代碼,因為你應該自己嘗試一下。

您應該添加一個額外的循環來從x向下迭代到1

請注意,您的代碼對於值1無法正常工作,並且不會計算正確位置的輸出數量,從而導致令人驚訝的+ 2最終調整。

將代碼移動到單獨的函數會提高可讀性。

您的保護循環沒有意義:在x * x迭代后停止假設x * xunsigned long的范圍內,該范圍可能非常低( x < 65536在 Windows 上)。 較大的值可能會給出不正確的結果。 只需刪除保護測試就可以簡化代碼,如果我們假設Collat​​z 猜想為真(它已經針對所有起始值進行了測試,直到 2 60 )任何產生無限循環的反例都會受到歡迎。

這是一個簡化和擴展的版本:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM