USACO Training Section 2.2 Runaround Numbers

本文介绍了一个USACO编程竞赛中的Runround数字问题,通过C++代码实现了解决方案,该程序用于判断一个数字是否为Runround数字,并找到满足条件的最小数字。
[url="http://ace.delos.com/usacoprob2?a=3nbwNTZTBNm&S=runround"]英文原题[/url] [url="http://www.wzoi.org/usaco/12%5C205.asp"]中文题译[/url]

相当简单的逐个查找是否满足要求的数,注意题目里说数字是唯一的。


/*
ID: blackco3
TASK: runround
LANG: C++
*/
#include <iostream>
#include <memory.h>
using namespace std;

int digs[32], n_dig, visited[10];
int is_around( int num ) {
for( n_dig=0; num ; n_dig++ ){
if( (digs[n_dig]=num%10)==0 )
return false ;
num /= 10 ;
}
memset( visited, 0, sizeof(visited) );
int cur_pos=n_dig-1 ;
for( int irun=0; irun<n_dig; irun++ ){
cur_pos -= digs[cur_pos] % n_dig ;
cur_pos = cur_pos<0 ? n_dig+cur_pos : cur_pos ;
if( visited[digs[cur_pos]] )
return false ;
visited[digs[cur_pos]]=1 ;
}
return true ;
}

int main() {
freopen("runround.in", "r", stdin);
freopen("runround.out", "w", stdout);
int n ;
cin >> n ;
while( !is_around(++n) );
cout << n << endl ;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值