2016年9月13日 星期二

[ACM] Q100 The 3n + 1 problem

好久沒寫ACM,練練手感。
我也放上Github了,好久沒寫這麼多註解了,如果有問題可以問我。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
/*CPE Q100: The 3n + 1 problem*/
/*題目
*/
using namespace std;
//題目講的演算法
long algorithm(long n){
long cycle = 1;
while(n > 1){
if(n%2 != 0){
n = 3*n + 1;
}else{
n = n/2;
}
cycle++;
}
return cycle;
}
int main(){
long i,j,n;
//無限迴圈讓使用者可以一直輸入數值進去(程式不會結束)
while(true){
//輸入i跟j
cin >> i >> j ;
//如果i比j大,i的值放到j,j的值放到i(交換)
//我們希望不管怎樣一定是i<j,後面邏輯才好處理
if(i>j){
long tmp = i;
i = j;
j = tmp;
}
//預設最大的輪迴次數為0
long maxCycle = 0;
//n的數值範圍是i到j,所以跑i到j範圍的迴圈
for(long n = i;n <= j;n++){
//執行題目所說的演算法
//計算他跑迴圈的次數
long nCycle = algorithm(n);
//如果比目前設定的最大輪迴次數還大
//就取代掉他把值放進maxCycle
if(nCycle > maxCycle){
maxCycle = nCycle;
}
}
cout << i << " " << j << " "<< maxCycle <<endl;
}
return 0;
}