3n+1 要做幾次

1.0s 256M

給你一個正整數 \(n\),請一直重複下面的操作,直到 \(n\) 變成 \(1\) 為止:

  • 如果 \(n\) 是偶數,把 \(n\) 除以 \(2\)。
  • 如果 \(n\) 是奇數,把 \(n\) 變成 \(3n + 1\)。

請問總共要操作幾次?

例如 \(n = 6\) 時,變化過程是:

6 -> 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1

總共操作了 \(8\) 次,所以答案是 \(8\)。

語法限制

本題採用語法書第四單元〈迴圈〉的語法限制。你可以使用 if、else、迴圈、比較運算、邏輯運算、整數變數、cin、cout 與 cout << endl;但不可使用陣列或容器,也不可使用 main 以外的任何函式(包含內建函式與自定義函式)。其中 endl 只有作為輸出換行用法時允許,不能寫成函式呼叫。

評測時會自動檢查你的程式碼,違反限制會直接得到 Wrong Answer,回饋訊息會顯示「語法限制未通過」以及違規的位置。

點我展開:本題允許與禁止的語法清單

允許使用:

  • #include <iostream> 或其他一般 include(但不需要額外標頭)
  • using namespace std;
  • int main() 主函式與 return 0;
  • 整數、布林與字元變數,例如 int、long long、bool、char
  • cin >> 讀入、cout << 輸出,可以使用 cout << endl
  • if、else、for、while
  • 算術、比較與邏輯運算子,例如 +、-、*、/、%、<、<=、==、&&
  • 指派與遞增遞減,例如 =、+=、++、--
  • 註解(// 與 /* */)

禁止使用(列出常見項目):

  • 陣列與索引語法 []
  • vector、array、string、deque、map、set 等容器或類似工具
  • new、delete 等動態配置語法
  • main 以外的任何函式呼叫或函式宣告,包含 max、min、abs、sqrt、pow、sort、swap、getline、printf、scanf
  • #define 等非 include 的前置處理指令

輸入格式

輸入只有一行,包含一個正整數 \(n\)。

限制

  • \(1 \le n \le 1000\)
  • 記憶體限制為 \(256\) MB

輸出格式

輸出一個整數,代表 \(n\) 變成 \(1\) 之前總共操作了幾次。

範例輸入 1

6

範例輸出 1

8

範例輸入 2

1

範例輸出 2

0

範例說明

範例 2 的 \(n\) 一開始就是 \(1\),不需要操作,所以答案是 \(0\)。

題目頁說明

快速鍵

主要功能

  • 範例測試 — 執行題目附帶的範例測資並自動比對預期輸出。
  • 自訂測試 — 自己貼 stdin 執行程式。可勾選「與預期輸出比對 (diff)」做行對行比對。
  • 模板 — 貼上你在個人資料設定的預設程式碼模板。
  • 協作 — 與其他同學共筆編輯這題的程式碼。
  • 自動草稿 — 編輯器內容每 1.5 秒自動存到瀏覽器(per 帳號 / 題目 / 語言)。
  • 提交 — 把程式碼交給 judge 評測,回傳 AC / WA / TLE 等結果。

限制

  • 程式碼最多 65,536 字元
  • 自訂測試 stdin 與預期輸出各最多 1 MB (約 100 萬字元)
  • 自訂測試與範例測試共用一個沙箱,每人約 3 秒 1 次 (範例測試 1 秒 1 次)
  • 自訂測試與範例測試都有 15 秒 牆鐘上限(正式評測仍依題目原本時限)
  • 互動題不提供自訂測試(無法模擬與 judge 互動)。
  • 提交評測本身沒有 rate limit,但同題短時間內多次提交會被視為刷分。