一個數字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
- #include <iostream>
- using namespace std;
-
- int main() {
- int a, b, c; //a是第一個數字,b是第一個數字,c是讓ab兩者交換的變數
- int n = 0; //現在是a~b之間的哪個正在算長度的數字
- int length = 0; //n 的長度
- bool change = false; //檢測是否交換的布靈值
- int max = 0; //最大長度
- while(cin >> a >> b) //使用者輸入a, b
- {
- if(a > b) //題目沒說a一定比b小,要假設a > b大的狀況
- {
- c = a; //互換
- a = b; //互換
- b = c; //互換
- change = true; //表示互換過
- }
-
- for(int i = a; i <= b; i++) //開始計算n的長度
- {
- int n = i; //n從a開始
- length = 1; //自己也算長度
- while(true)
- {
- if(n == 1) //如果n到一則計算長度結束,跳出迴圈
- {
- break;
- }
- if(n % 2 == 0) //如果是偶數
- {
- n = n / 2;
- }
- else //如果是奇數
- {
- n = 3 * n + 1;
- }
- length++; //不管奇數還偶數,長度+1
- }
- if(length > max) //計算出來的長度如果大於之前的長度,則存入max
- {
- max = length;
- }
- length = 0;
- }
- if(change) //change如果等於true代表a, b互換過,那要再換回來
- {
- c = a; //互換
- a = b; //互換
- b = c; //互換
- }
- cout << a << " " << b << " " << max << endl;
- max = 0;
- change = false;
- }
- return 0;
- }