zoukankan      html  css  js  c++  java
  • 洛谷P1467 循环数 Runaround Numbers

    P1467 循环数 Runaround Numbers

      • 89通过
      • 233提交
    • 题目提供者该用户不存在
    • 标签USACO
    • 难度普及/提高-

      讨论  题解  

    最新讨论

    • 暂时没有讨论

    题目描述

    循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子:

    如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果停在一个相同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6

    重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2

    再这样做 (这次数两个): 8 1

    再一次 (这次一个): 3

    又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。

    给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数(21亿)装下。 (追加提醒:循环数每个数位都必须要访问到)

    输入输出格式

    输入格式:

    仅仅一行, 包括M.

    输出格式:

    仅仅一行,输出第一个比M大的循环数。

    输入输出样例

    输入样例#1:
    81361
    
    输出样例#1:
    81362
    

    说明

    翻译来自NOCOW

    USACO 2.2

    分析:这道题有一半是在考语文......其实读懂了就会发现这道题就是一道枚举的水题,因为没告诉范围,所以只要找到符合条件的数就可以,关键是怎么判断,首先判重,并在判重中看看原数有没有0,然后按照题目说的性质一步一步来,注意取模就行.不过要注意的是,因为要对多个数进行处理,每次进行处理之前要先初始化数组!

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n,num[11],vis1[11],vis2[11],temp,cur;
    bool flag = true;
    
    void fanzhuan()
    {
        int j = temp;
        for (int i = 1; i < j; i++)
            swap(num[i], num[j--]);
    }
    
    bool panchong(int x)
    {
        int vis[10];
        memset(vis, 0, sizeof(vis));
        while (x)
        {
            if (x % 10 == 0)
                return false;
            if (vis[x % 10])
                return false;
            vis[x % 10] = 1;
            x /= 10;
        }
        return true;
    }
    
    bool check(int x)
    {
        memset(num, 0, sizeof(num));
        memset(vis1, 0, sizeof(vis1));
        memset(vis2, 0, sizeof(vis2));
        temp = 1;
        while (x) {
            if (vis1[(num[temp] = x % 10)])
                return false;
            vis1[num[temp++]] = true;
            x /= 10;
        }
        temp--;
        fanzhuan();
        cur = 1;
        while (!vis2[num[cur]])
        {
            vis2[num[cur]] = 1;
            cur += num[cur] % temp;
            if (cur > temp)
                cur %= temp;
        }
        if (num[cur] != num[1])
            return false;
        for (int i = 1; i <= temp; i++)
            if (!vis2[num[i]])
                return false;
        return true;
    }
    
    int main()
    {
        scanf("%d", &n);
        int i = n + 1;
       while (1)
        {
            if (panchong(i))
                if (check(i) == true)
                    break;
            i++;
        }
        printf("%d
    ", i);
    
        return 0;
    }
  • 相关阅读:
    贝叶斯公式由浅入深大讲解—AI基础算法入门
    再谈前端HTML模板技术
    再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
    mac版chrome升级到Version 65.0.3325.18后无法打开百度bing搜狗
    图说js中的this——深入理解javascript中this指针
    web app响应式字体设置!rem之我见
    【2020-04-18】 加班
    【2020-04-06】汇郡海下的沉思
    【2020-03-28】Dubbo源码杂谈
    【2020-03-21】Dubbo本地环境搭建-实现服务注册和消费
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5928145.html
Copyright © 2011-2022 走看看