在网上看到的一个比较好的The 3n+1 problem,通过中间变量来保存结果集,较少了运算数量
1 #include <iostream>
2
3 #include <vector>
4
5
6
7 #define SIZE 100000
8
9
10
11 using namespace std;
12
13
14
15 int Count(vector<int> &viRec, int iNum)
16
17 {
18
19 int iTemp=iNum, iResult=0;
20
21
22
23 if (viRec[iTemp]!=0) return viRec[iTemp];
24
25 while (iTemp!=1)
26
27 {
28
29 if (iTemp<=SIZE && viRec[iTemp]!=0)
30
31 {
32
33 viRec[iNum]=iResult+viRec[iTemp];
34
35 return viRec[iNum];
36
37 }
38
39 if ((iTemp&1)==0) iTemp=iTemp>>1;
40
41 else iTemp=iTemp*3+1;
42
43 iResult++;
44
45 }
46
47 viRec[iNum]=iResult;
48
49 return iResult;
50
51 }
52
53
54
55 int main()
56
57 {
58
59 vector<int> viRec(SIZE+1, 0);
60
61 int iBegin, iEnd;
62
63
64
65 while (cin>>iBegin>>iEnd)
66
67 {
68
69 int iMax=0;
70
71
72
73 if (iBegin>iEnd) swap(iBegin, iEnd);
74
75 for (int i=iBegin; i<=iEnd; i++)
76
77 {
78
79 int iTemp=Count(viRec, i);
80
81
82
83 if (iTemp>iMax) iMax=iTemp;
84
85 }
86
87 cout<<iMax<<endl;
88
89 }
90
91 return 0;
92
93 }