题目大意就是给出一个M,求比M大得最小的一个“循环数”
- 如果你从最左边的数字开始 ( 在这个例子中是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 这是你回到了起点, 在从每一个数字开始数1次之后. 如果你在从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。
这题可以从M开始,一个个枚举数据,知道遇到循环数,没什么技术含量1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86/*
ID:shiryuw1
PROG:runround
LANG:C++
*/
using namespace std;
bool isrod(unsigned m)
{
unsigned t=m;
bool num[10]={false};
char str[20]={0};
sprintf(str,"%u",m);
char ch=str[0];
char len=strlen(str);
int k=0;
num[str[0]-'0']=true;
k=(k+(str[0]-'0'))%len;
while(k)
{
if(num[str[k]-'0'])
{
return false;
}
num[str[k]-'0']=true;
k=(k+(str[k]-'0'))%len;
}
int i,sum=0;
for(i=0;i<10;i++)
sum+=num[i];
if(sum<((int)log10(1.0*m)+1))
return false;
return true;
}
int main()
{
freopen("runround.in","r",stdin);
freopen("runround.out","w",stdout);
unsigned m;
scanf("%u",&m);
m++;
while(m)
{
bool tag=false;
unsigned t=m;
unsigned num[10]={0};
unsigned k=1
while(t)
{
int s=t%10;
if(s==0)
{
m+=k;
tag=true;
break;
}
if(num[s]!=0)
{
m+=num[s];
tag=true;;
break;
}
num[s]=k;
k*=10;
t/=10;
}
if(tag)
{
continue;
}
if(isrod(m)==true)
{
printf("%u\n",m);
break;
}
else
m++;
}
return 0;
}