1129: 零起點學算法36——3n+1問題
Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: 4541 Accepted: 1235
[Submit][Status][Web Board]
Description
任給一個正整數n,如果n為偶數,就將它變為n/2,如果為奇數,則將它乘3加1(即3n+1)。不斷重復這樣的運算,經過有限步后,一定可以得到1 。
Input
輸入1個正整數n(n <= 10^10)(多組數據)
Output
輸出變化的次數(每組數據一行)
Sample Input 
3
Sample Output
7
HINT
使用 while 循環
使用 while 語句在條件成立時重復某動作,類似於 if 語句,只要條件為 true 就重復動作。
while 循環計算一個表達式的值,如果表達式為 true,則會執行循環體中的代碼。如果條件計算結果為 true,在循環返回以再次計算條件前執行一條語句或一系列語句。條件計算結果為 false 后,則跳過語句或一系列語句並結束循環。在不確定要將一個代碼塊循環多少次時,使用 while 循環可能會非常有用。
例如,下面的代碼將數字顯示到"輸出"面板中:
var i:Number = 0;
while (i < 5)
{
trace(i);
i++;
}
您會看到以下數字顯示到"輸出"面板中:
0
1
2
3
4
使用 while 循環而非 for 循環的一個缺點是,在 while 循環中更有可能編寫出無限循環。如果遺漏遞增計數器變量的表達式,則 for 循環示例代碼將無法編譯;而 while 循環示例代碼將能夠編譯。若沒有遞增 i 的表達式,循環將成為無限循環。
Source
1 #include<stdio.h> 2 int main(){ 3 long long n; 4 while(scanf("%d",&n)!=EOF){ 5 int cout=0; 6 while(n!=1){ 7 if(n%2==0){ 8 n/=2; cout++; 9 } 10 else{ 11 n=3*n+1; cout++; 12 } 13 } 14 printf("%lld\n",cout); 15 } 16 return 0; 17 }
此題有陷阱。 首先n的范圍是10的10次冪。
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
數值太大 用long long 輸入 lld輸出