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/p/1752984.html