USACO 2.2 Runaround Numbers (runround)

//Main Idea
//First check whether the digits are unique
//then check the runround property;

/*
ID: haolink1
PROG: runround
LANG: C++
*/

//#include <iostream>
#include <fstream>

using namespace std;

typedef unsigned long u_long;
typedef long long l_long;

bool visited_digit[10] = {false}; 
short digits[20] = {0};


int main(){
    ifstream fin("runround.in");
    u_long begin;
    fin >> begin;
    //cout << sizeof(long) <<" "<<sizeof(long long)<<endl;
    l_long max = u_long(-1) ;
    for(l_long i = begin + 1; i <= max; i++){
        short remainder = 0;
        bool digit_unique = true;
        short digit_counter = 0;
        l_long cur_value = i;
        //Check digit unique;
        while(cur_value > 0){
            remainder = cur_value % 10;
            if(visited_digit[remainder] == true){
                digit_unique = false;
                break;
            }else{ 
                visited_digit[remainder] = true;
                digits[digit_counter++] = remainder;
            }
            cur_value /= 10;
        }
        if(digit_unique == true){
            //Reset 
            for(short i = 0; i < 10; i++){
                visited_digit[i] = false;
            }
            //Check runround property;
            bool is_valid = true;
            short digit_num = digit_counter;
            //Note -5 % 10 = -5; So in order to make sure the modulus is positive we use 9 * digit_num;
            short cur_index = (digit_num - 1 -digits[digit_num-1] + 9 * digit_num)%digit_num;
            while(digit_counter > 0){
                if(visited_digit[cur_index] == false){
                    visited_digit[cur_index] = true;
                    cur_index = (cur_index - digits[cur_index] + 9 * digit_num)%digit_num;
                    digit_counter--;
                }else{
                    is_valid = false;
                    break;
                }
                //The index "digit_num -1" should be visited last;
                if(cur_index == (digit_num -1) && digit_counter != 1){
                    is_valid = false;
                    break;
                }
            }
            if(is_valid == true){
                ofstream fout("runround.out");
                for(short j = digit_num - 1; j >=0;j--){
                    fout<<digits[j];
                }    
                fout<<endl;
                return 0;
            }
        }
        //Reset 
        for(short i = 0; i < 10; i++){
            visited_digit[i] = false;
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值