USACO - 2.2 Runaround Numbers(枚举)

本文解析了一个USACO编程题目,任务是找出大于给定数字的最小循环数。文章详细介绍了通过枚举和检查条件来判断一个数是否为循环数的方法,并提供了一段C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}



 

转载于:https://www.cnblogs.com/Jstyle-continue/p/6351980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值