2-16 HDO1106

  这题寒假也没搞出来,但今天花了一小时终于搞定。

 

  题意是输入一串数字字符,把‘5’当作空格,然后把被分割开的数字进行排序输出。

 

  首先是字符串输入,按照高精度的处理方法,数值低位放到数组低位。(字符串型的S转到整形的A)

 

  然后,开始对A数组遍历,将第i位的数值乘以10的i次方,累加到B数组(整形)。遇到5则continue,当然还要对累加时的变量进行重置。

 

  上述的做法有两个点要特别注意到,如果A数组的最后一位不是5,而整个数组里5的数量不为0,则B数组的个数要加1,二是如果数组里5的数量为0,则B的个数也要加1。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     char s[1005];
11     int a[1050],b[300],i,j,slen,ilen,pos,top,dou,sum;
12     while(scanf("%s",s)!=EOF)
13     {
14         memset(b,0,sizeof(b));
15         slen = strlen(s);
16         sum = 0;
17         for(i=slen-1,j=0; i>=0; i--)
18         {
19             a[j] = s[i] - '0';
20             if(a[j] == 5)
21                 sum ++;
22             j++;
23         }
24         if(a[0] == 5)
25         {
26             i = 1;
27         }
28         else
29         {
30             i = 0;
31         }
32         for(top=0,dou=1; i<slen; i++)
33         {
34             if(a[i]==5 && a[i-1] == 5)
35                 continue;
36             if(a[i] == 5)
37             {
38                 pos = i;
39                 dou = 1;
40                 top++;
41                 continue;
42             }
43             else
44             {
45                 b[top] += a[i]*dou;
46                 dou*=10;
47             }
48         }
49         if(a[slen-1] != 5 && sum!=0)
50             top++;
51         if(sum == 0)
52             top++;
53         sort(b,b+top);
54         for(i=0; i<top-1; i++)
55             printf("%d ",b[i]);
56         printf("%d\n",b[top-1]);
57     }
58     return 0;
59 }

 

posted @ 2014-02-16 21:53  猫御龙  阅读(236)  评论(0编辑  收藏  举报