Numbers that count 1016 PKU

Description:

一个数的inventory是0-9每个数字出现多少次,例如5553141的inventory是21131435

1. 如果一个数的inventory是其本身,则称其为self-inventorying,例如31123314的inventory还是31123314

2. 一个数迭代j步求inventory之后可能是self-inventorying ,例如21221314à31321314à31123314à31123314,则21221314 is self-inventorying after 2 steps

3. 一个数inventory迭代时,可能在第j步之后,进入一个长度为看的inventory循环,例如314213241519 enters aninventory loop of length 2,314213241519à 412223241519à 314213241519:j=0,k=2

4. 一个数如果15次迭代之后没有上述性质,则ncan not be classified after 15 iterations

Solution:

 

 
  
1 #include < stdio.h >
2 #include < string .h >
3
4   #define CHARSIZE 128
5
6   void Inventory( char * in , char * out )
7 {
8 int usedTime[ 10 ] = { 0 };
9 int i = 0 ,k = 0 ,p_s = 0 ,flag = 0 ;
10 int temp[ 16 ];
11
12 // memset((void*)usedTime,0,sizeof(usedTime));
13  
14 for (i = 0 ; in [i]; i ++ )
15 usedTime[ in [i] - ' 0 ' ] ++ ;
16
17 for (p_s = 0 ,i = 0 ; i < 10 ; i ++ )
18 {
19 k = - 1 ;
20 flag = 0 ;
21 while (usedTime[i])
22 {
23 temp[ ++ k] = usedTime[i] % 10 + ' 0 ' ;
24 usedTime[i] /= 10 ;
25 flag = 1 ;
26 }
27 while (k >= 0 )
28 {
29 out [p_s ++ ] = temp[k -- ];
30 }
31 if (flag)
32 out [p_s ++ ] = i + ' 0 ' ;
33 }
34 out [p_s ++ ] = ' \0 ' ;
35 }
36
37   int main ()
38 {
39 char inStr[ 16 ][CHARSIZE];
40 int i = 0 ,j = 0 ;
41
42 while (scanf ( " %s " ,inStr[ 0 ]))
43 {
44 if (inStr[ 0 ][ 0 ] == ' - ' )
45 break ;
46
47 for (i = 0 ; i < 15 ; i ++ )
48 {
49 Inventory(inStr[i],inStr[i + 1 ]);
50 // self-inventorying after i steps
51 if (strcmp(inStr[i],inStr[i + 1 ]) == 0 )
52 {
53 // to do
54 if (i)
55 printf ( " %s is self-inventorying after %d steps\n " ,inStr[ 0 ],i);
56 else
57 printf ( " %s is self-inventorying\n " ,inStr[ 0 ]);
58 break ;
59 }
60 // for (j=0; j<i; j++)
61 // 注意,必须写成下列格式才能保证minimize the length of inventory loop
62 for (j = i - 1 ; j >= 0 ; j -- )
63 if (strcmp (inStr[i + 1 ],inStr[j]) == 0 )
64 {
65 printf ( " %s enters an inventory loop of length %d\n " ,inStr[ 0 ],i + 1 - j);
66 break ;
67 }
68 if (j >= 0 )
69 break ;
70 }
71 if (i == 15 )
72 printf ( " %s can not be classified after 15 iterations\n " ,inStr[ 0 ]);
73 }
74 return 0 ;
75 }

 

 

转载于:https://www.cnblogs.com/eavn/archive/2010/06/07/1752984.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值