天天看點

c語言3n 1問題次數代碼,C語言每日小練(一)——3n+1問題

例:3n+1問題

對于任意大于1的自然數n,若n為奇數,則将n變為3n+1,否則變為n的一半。經過若幹次變換,一定會使n變為1。例如3-》10-》5-》16-》8-》4-》2-》1。

輸入n,輸出變換的次數。n不大于10的九次幂。

樣例輸入:3

樣例輸出:7

解:直接模拟過程即可,下面是代碼:

#includeint main()

{

int n, count = 0;

scanf("%d", &n);

while(n > 1)

{

if(n%2 == 1) n = n * 3 + 1;

else n /= 2;

count++;

}

printf("%d\n", count);

return 0;

}驗證上面樣例,發現正确:

c語言3n 1問題次數代碼,C語言每日小練(一)——3n+1問題

那如果輸入的是999999999呢?結果:

c語言3n 1問題次數代碼,C語言每日小練(一)——3n+1問題

居然是1!原來是因為定義的n為int型整數,它的最大值為2147483647,也就是說,在程式剛剛執行了一次“n = 3*n+1”時,就已經溢出了,是以直接輸出了1~是以隻好用64位長整型了,程式如下:

#includeint main()

{

int count = 0;

long long n;//定義64位長整型數

scanf("%lld", &n);//此處"%lld"也可寫成"%I64d"

while(n > 1)

{

if(n%2 == 1) n = n * 3 + 1;

else n /= 2;

count++;

}

printf("%d\n", count);

return 0;

}下面看運作結果:

c語言3n 1問題次數代碼,C語言每日小練(一)——3n+1問題

程式正常運作~

總結:在編寫程式時,要注意定義的變量溢出的問題,否則很可能糾結于程式的邏輯正确與否上卻發現怎麼也找不出Bug,糾結啊...