![](/img/trans.png)
[英]Looking for a C program that can detect whether a sequence similar to the Collatz conjecture terminates or not
[英]How can I decrement numbers in Collatz conjecture program in C
目前我正在用 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;
}
請幫我解決這個問題。
一個好主意是為函數中的 1 個元素使用 Collatz 函數。 此函數將采用元素的參數,例如 25,然后打印 25 的 collatz 系列。
然后,您可以圍繞該函數運行一個循環,使用參數 24、23、22 等調用它。這將為所有這些數字提供 collatz 系列。
我沒有給出代碼,因為你應該自己嘗試一下。
您應該添加一個額外的循環來從x
向下迭代到1
。
請注意,您的代碼對於值1
無法正常工作,並且不會計算正確位置的輸出數量,從而導致令人驚訝的+ 2
最終調整。
將代碼移動到單獨的函數會提高可讀性。
您的保護循環沒有意義:在x * x
迭代后停止假設x * x
在unsigned long
的范圍內,該范圍可能非常低( x < 65536
在 Windows 上)。 較大的值可能會給出不正確的結果。 只需刪除保護測試就可以簡化代碼,如果我們假設Collatz 猜想為真(它已經針對所有起始值進行了測試,直到 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.