zoukankan      html  css  js  c++  java
  • 每日编程-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 }
  • 相关阅读:
    P1726 上白泽慧音
    P1993 小k的农场
    P1983 车站分级
    P1525 关押罪犯【二分+二分图】
    P1268 树的重量【构造】
    P1113 杂务
    F.Three pahs on a tree
    P1522 牛的旅行
    两个约束下的dp问题
    dp 最大正方形
  • 原文地址:https://www.cnblogs.com/linhaowei0389/p/6648162.html
Copyright © 2011-2022 走看看