循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子: 8 1 3 6 2
如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以我们得到的下一个数字是6。
重复这样做 (这次往后6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是我们得到了2
再这样做 (这次往后数2个): 8 1,我们得到了1.
再一次 (这次往后数1个): 3
又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M, 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数装下。
输入包括一行,为整数M(0≤M≤100000000)
输出包括一行,为第一个比M大的循环数。
样例输入
81361
样例输出
81362
解答:
纯粹是想到哪写到哪。
给个数就存个数(无符号长整型)
不能有0就检查0
不能重复就检查重复(用的泛型算法,好懒……)
然后把数字的每一位存到一个双端队列里(因为一开始忘了vector也能push_front,就用了deque)
从第0个元素开始移动,到一个位置就把这个位置置0.
如果当前位置是0,就失败(就是到了重复的位置)
如果最后一次之后,个个位数的和不是0,就失败(说明有的哪位没有走到,求和还是用的泛型算法……)
最后一次计算完下标后,如果下标不是0,说明跑偏了,也失败
都通过了,才成功
1 #include <iostream> 2 #include <algorithm> 3 #include <numeric> 4 #include <deque> 5 using namespace std; 6 7 unsigned long nextXHS(unsigned long n) { 8 bool flag = true; 9 while (flag) 10 { 11 unsigned long m = ++n; 12 flag = false; 13 deque<int> de; 14 while (m != 0) 15 { 16 if ((find(de.begin(), de.end(), m % 10) != de.end()) || (m % 10 == 0)) 17 { 18 flag = true; 19 break; 20 } 21 de.push_front(m % 10); 22 m /= 10; 23 } 24 int index = 0; 25 for (auto i = 0; i < de.size() + 1; i++) 26 { 27 if (flag) break; 28 if (i == (de.size() -1)) 29 { 30 int tmp = de[index]; 31 de[index] = 0; 32 index = (index + tmp) % de.size(); 33 if ((index == 0) && (accumulate(de.begin(), de.end(), 0) == 0)) 34 break; 35 } 36 if (de[index] == 0) 37 { 38 flag = true; 39 break; 40 } 41 int tmp = de[index]; 42 de[index] = 0; 43 index = (index + tmp) % de.size(); 44 } 45 } 46 return n; 47 } 48 int main() { 49 unsigned long ul; 50 while (cin >> ul) 51 { 52 cout << nextXHS(ul) << endl; 53 } 54 }