1129: 零起點學算法36——3n+1問題


1129: 零起點學算法36——3n+1問題

Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lld
Submitted: 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輸出


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM