USACO - 2.2 Runaround Numbers(枚举)

题目链接:http://train.usaco.org/usacoprob2?a=ScFaavqnaPI&S=runround

/*
ID: 1590291
TASK: runround
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
using namespace std;
/****************************************************************************************************************
            题意:给定一个数字,输出大于该数字的最小循环数。循环数概念看题
            思路:
            1,枚举即可,把情况考虑全
            2,注意题意 数字智能由 1~9组成且只出现一次,注意没有0!!!在遍历大于给定的数字时注意考虑
****************************************************************************************************************/
int sign[20],cont[20];
int fuc(long x)
{
    memset(sign,0,sizeof(sign));
    memset(cont,0,sizeof(cont));

    int le=(int)log10(x)+1;  //k为长度
    int num=0;

    if(le == 1) return 0;
    for(int i = le-1;i >= 0;i -- , x/=10)
        sign[i]=x%10;

    for(int i = 0;i < le;i ++)
        cont[sign[i]]++;
    for(int i = 0;i < le;i ++)
        if(cont[i] > 1)
            return 0;

    memset(cont,0,sizeof(cont));
    int id=0;
    for(int i = 0;i < le;i ++){
        cont[sign[id]]++;
        if(cont[sign[id]] > 1)
            return 0;
        id=(id+sign[id])%le;
    }
    if(id != 0) return 0;       //这个最容易忘了,题意说不能有 0,这个就可以排除~
    return 1;
}

int main()
{
    ifstream fin("runround.in");
    ofstream fout("runround.out");

    unsigned long n;
    while(fin>>n)
    {
        for(long i = n+1; ;i ++){
            if(fuc(i)){
                fout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}



 

posted on 2016-05-04 22:17  Jstyle  阅读(105)  评论(0编辑  收藏  举报

导航