陳新龍
冰雹猜想雖然運算規則簡單,但這個謎題至今都沒能被證明出來。冰雹猜想規則很簡單,任意寫出一個(非零)自然數N,并且按照規律進行變換:如果是個奇數,則下一步變成 3N+1;如果是個偶數,則下一步變成 N/2,數列最終都會回到1。在45年前這個數學游戲剛剛出現時學生、教師、教授,甚至是一等一的數學大咖都紛紛加入這個看似簡單的數學游戲,人們取了各種各樣的數字N去檢驗這個算法,最終都無一例外地墜入自然數序列4→2→1。于是就自然萌生出這樣的猜想:對于任意非零自然數N,經上述變換最終都將落入4→2→1序列的宿命。這就是“冰雹猜想”或稱“角谷猜想”。根據數學家的研究任何小于7×1011的所有的正整數,都符合這個規律。
例如輸入自然數N=6。6是偶數,要先除以2,6÷2=3;3是奇數,要將它乘3之后再加1,3×3+1=10;按照上述法則繼續往下做:10÷2=5,5×3+1=16,16÷2=8,8÷2=4,4÷2=2,2÷2=1。從6開始經歷了3→10→5→16→8→4→2→1,最后得到1。其實冰雹猜想最大的魅力在于其不可預知性,數字轉化過程變化莫測,有時候平緩溫和,有時候劇烈浮沉,無一例外都會墜入4→2→1的谷底,好比是一個數學黑洞,將所有的自然數牢牢吸住(圖1)。

27的歸一要經過劇烈波動
由于這個猜想計算簡單但需要重復多次計算,用程序來計算更加合適,看看我們給出的數字最后是否歸一,我們選擇Scratch和C語言分別進行編寫。通過兩種語言使用相同的算法讓大家從圖形化編程轉向純代碼編程,提高編程能力(圖2)。

首先用戶輸入一個數字,設置兩個變量,一個變量記錄用戶輸入的數字,變量“步數”記錄完成歸一的變化次數。由于該猜想認為輸入任何數字最后的結果都等于1,所以循環中止條件為數字等于0或等于1時,跳出循環。循環中有兩個條件,當數字是奇數時,將數字×3+1,輸出到列表中;如果數字是偶數,將數字/2,輸出到列表中(圖3)。

我們將Scratch中使用的算法用到C語言中,首先scanf輸入一個非零整數,然后添加一個while循環,在循環中進行判斷,數字為奇數時乘3加1,數字為偶數時除以2,直到最后數字等于1時結束循環。輸出每次運行后的值。
#include
int main()
{
int N, i = 0, j = 0;
printf("請輸入一個非0整數:");
scanf("%d",&N);
while( N != 0 && N !=1 )
{
if (N%2 == 0)
{
N = N / 2;
i++;
printf("%d--",N);
}
else if( N%2 == 1)
{
N = 3*N+1;
i++;
printf("%d--",N);
}
}
printf("結束\n此次冰雹猜想的變換次數 == %d\n",i);
return 0;
}
無需安裝配置編輯環境,搜索“C在線工具”在網頁上執行代碼,運行結果一致(圖4)。

當我們掌握C語言的語法之后,按照正確的思路就很容易編寫出完整的代碼,無需畏懼代碼編程。