陳新龍
冰雹猜想雖然運算規(guī)則簡單,但這個謎題至今都沒能被證明出來。冰雹猜想規(guī)則很簡單,任意寫出一個(非零)自然數(shù)N,并且按照規(guī)律進(jìn)行變換:如果是個奇數(shù),則下一步變成 3N+1;如果是個偶數(shù),則下一步變成 N/2,數(shù)列最終都會回到1。在45年前這個數(shù)學(xué)游戲剛剛出現(xiàn)時學(xué)生、教師、教授,甚至是一等一的數(shù)學(xué)大咖都紛紛加入這個看似簡單的數(shù)學(xué)游戲,人們?nèi)×烁鞣N各樣的數(shù)字N去檢驗這個算法,最終都無一例外地墜入自然數(shù)序列4→2→1。于是就自然萌生出這樣的猜想:對于任意非零自然數(shù)N,經(jīng)上述變換最終都將落入4→2→1序列的宿命。這就是“冰雹猜想”或稱“角谷猜想”。根據(jù)數(shù)學(xué)家的研究任何小于7×1011的所有的正整數(shù),都符合這個規(guī)律。
例如輸入自然數(shù)N=6。6是偶數(shù),要先除以2,6÷2=3;3是奇數(shù),要將它乘3之后再加1,3×3+1=10;按照上述法則繼續(xù)往下做:10÷2=5,5×3+1=16,16÷2=8,8÷2=4,4÷2=2,2÷2=1。從6開始經(jīng)歷了3→10→5→16→8→4→2→1,最后得到1。其實冰雹猜想最大的魅力在于其不可預(yù)知性,數(shù)字轉(zhuǎn)化過程變化莫測,有時候平緩溫和,有時候劇烈浮沉,無一例外都會墜入4→2→1的谷底,好比是一個數(shù)學(xué)黑洞,將所有的自然數(shù)牢牢吸住(圖1)。
27的歸一要經(jīng)過劇烈波動
由于這個猜想計算簡單但需要重復(fù)多次計算,用程序來計算更加合適,看看我們給出的數(shù)字最后是否歸一,我們選擇Scratch和C語言分別進(jìn)行編寫。通過兩種語言使用相同的算法讓大家從圖形化編程轉(zhuǎn)向純代碼編程,提高編程能力(圖2)。
首先用戶輸入一個數(shù)字,設(shè)置兩個變量,一個變量記錄用戶輸入的數(shù)字,變量“步數(shù)”記錄完成歸一的變化次數(shù)。由于該猜想認(rèn)為輸入任何數(shù)字最后的結(jié)果都等于1,所以循環(huán)中止條件為數(shù)字等于0或等于1時,跳出循環(huán)。循環(huán)中有兩個條件,當(dāng)數(shù)字是奇數(shù)時,將數(shù)字×3+1,輸出到列表中;如果數(shù)字是偶數(shù),將數(shù)字/2,輸出到列表中(圖3)。
我們將Scratch中使用的算法用到C語言中,首先scanf輸入一個非零整數(shù),然后添加一個while循環(huán),在循環(huán)中進(jìn)行判斷,數(shù)字為奇數(shù)時乘3加1,數(shù)字為偶數(shù)時除以2,直到最后數(shù)字等于1時結(jié)束循環(huán)。輸出每次運行后的值。
#include
int main()
{
int N, i = 0, j = 0;
printf("請輸入一個非0整數(shù):");
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("結(jié)束\n此次冰雹猜想的變換次數(shù) == %d\n",i);
return 0;
}
無需安裝配置編輯環(huán)境,搜索“C在線工具”在網(wǎng)頁上執(zhí)行代碼,運行結(jié)果一致(圖4)。
當(dāng)我們掌握C語言的語法之后,按照正確的思路就很容易編寫出完整的代碼,無需畏懼代碼編程。