2017年9月25日 星期一

[UVa]100 - The 3n + 1 problem(C++)

一個數字x,如果是奇數,則3*x+1,如果是偶數,則x/2,最後得到1就結束並得知長度length。
x = 10 : 10 - 5 - 16 - 8 - 4 - 2 - 1,則長度7。
x = 6   : 6 - 3 - 10 - 5 - 16 - 8 - 4 - 2 - 1,則長度9。

題目說給定範圍a~b之間,找出最長長度mxx。
a = 2,b = 5,那就是找出2, 3, 4, 5的長度出來。

x = 2 : 2 - 1,則長度2
x = 3 : 3 - 10 - 5 - 16 - 8 - 4 - 2 - 1,則長度8
x = 4 : 4 - 2 - 1,則長度3
x = 5 : 5 - 16 - 8 - 4 - 2 - 1,則長度6

max = 8

  1. #include <iostream>  
  2. using namespace std;  
  3.    
  4. int main() {  
  5.     int a, b, c;  //a是第一個數字,b是第一個數字,c是讓ab兩者交換的變數
  6.     int n = 0;  //現在是a~b之間的哪個正在算長度的數字
  7.     int length = 0;  //n 的長度
  8.     bool change = false;  //檢測是否交換的布靈值
  9.     int max = 0;  //最大長度
  10.     while(cin >> a >> b)  //使用者輸入a, b
  11.     {  
  12.         if(a > b)  //題目沒說a一定比b小,要假設a > b大的狀況
  13.         {  
  14.             c = a;  //互換
  15.             a = b;  //互換
  16.             b = c;  //互換
  17.             change = true;  //表示互換過
  18.         }  
  19.    
  20.         for(int i = a; i <= b; i++)  //開始計算n的長度
  21.         {  
  22.             int n = i;   //n從a開始
  23.             length = 1;  //自己也算長度
  24.             while(true)  
  25.             {  
  26.                 if(n == 1)  //如果n到一則計算長度結束,跳出迴圈
  27.                 {  
  28.                     break;  
  29.                 }  
  30.                 if(n % 2 == 0)  //如果是偶數
  31.                 {  
  32.                     n = n / 2;  
  33.                 }  
  34.                 else  //如果是奇數
  35.                 {  
  36.                     n = 3 * n + 1;  
  37.                 }  
  38.                 length++;  //不管奇數還偶數,長度+1
  39.             }  
  40.             if(length > max)  //計算出來的長度如果大於之前的長度,則存入max
  41.             {  
  42.                 max = length;  
  43.             }  
  44.             length = 0;  
  45.         }  
  46.         if(change)  //change如果等於true代表a, b互換過,那要再換回來
  47.         {  
  48.             c = a;  //互換
  49.             a = b;  //互換
  50.             b = c;  //互換
  51.         }  
  52.         cout << a << " " << b << " " << max << endl;  
  53.         max = 0;  
  54.         change = false;  
  55.     }  
  56.     return 0;  
  57. }  

沒有留言:

張貼留言