PAT 乙级 1005
题目
题目地址:PAT 乙级 1005
题解
本题主要就在于将一个数的一系列计算结果不重复地存储起来并便于检索,考虑到STL中的集合有相似的特性,使用set可以有效地简化代码和运算。
过程如下:
(初始化两个集合,结果集合result和临时数据集合stmp)
1. 取第一个元素,判断其是否存在于result集合,不存在则将其加入result和stmp集合;
2. 进行运算,运算结果存入stmp集合;
3. 每一次运算结束后,判断运算结果是否存在于result集合中,如果存在则从result集合中删除该数;
4. 当运算结果为1时,结束该元素的运算,取下一个元素,重复1、2、3步骤。
代码
1 #include <iostream> 2 #include <set> 3 using namespace std; 4 5 int main() { 6 set<int> result; 7 set<int> stmp; 8 int k = 0; 9 int num[105]; 10 cin >> k; 11 for (int i = 0; i < k; i++) 12 cin >> num[i]; 13 for (int i = 0; i < k; i++) { 14 int tmp = 0; 15 if (!stmp.count(num[i])) { 16 result.insert(num[i]); 17 stmp.insert(num[i]); 18 } 19 while (num[i] != 1) { 20 if (num[i] % 2 == 0) 21 num[i] /= 2; 22 else 23 num[i] = (num[i] * 3 + 1) / 2; 24 stmp.insert(num[i]); 25 if (result.count(num[i])) { 26 set<int>::iterator it; 27 it = result.find(num[i]); 28 result.erase(it); 29 } 30 } 31 } 32 int size = result.size() - 1; 33 set<int>::reverse_iterator rit; 34 for (rit = result.rbegin(); rit != result.rend(); rit++) { 35 cout << *rit; 36 if (size--) 37 cout << ' '; 38 } 39 cout << endl; 40 41 return 0; 42 }