每日编程-20170330

循环数是那些不包括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 }

 

posted @ 2017-03-30 19:49  r088r088  阅读(205)  评论(1)    收藏  举报