_YueYang

导航

洛谷P6547题解

 

这题看上去很简单:把所有数字找出来再排序输出,但有几个注意点:

1.每个字符串长度不超过 100,说明数字最多又100位,要用string或char储存。但是建议用string,因为排序会很方便。

2.string是按照字典序排序的。升序的话233333要排在9的前面,因为9>2,所以我们要手写cmp。

3.要删去前缀零。

具体见代码:

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,len;
 4 string s,num[10500];
 5 int cmp(string a,string b){//手写升序cmp
 6     int la=a.size(),lb=b.size();
 7     if(la>lb){
 8         if(a<b)return a>b;
 9         return a<b;
10     }
11     if(la<lb){
12         if(a<b)return a<b;
13         return a>b;
14     }
15     return a<b;
16 }
17 int main(){
18     scanf("%d",&n);
19     for(int i=1;i<=n;++i){
20         cin>>s;
21         s=s+"d";
22         for(int j=0;j<s.size();++j){
23             if(s[j]>='0'&&s[j]<='9'){
24                 int k=j;
25                 while(s[j]>='0'&&s[j]<='9')++j;
26                 --j;//j就是这个数的最后一个数字的位置
27                 int flag=1;
28                 for(int h=k;h<=j;++h){
29                     if(s[h]!='0'){
30                         flag=0;
31                         break;
32                     }
33                 }
34                 if(flag){
35                     num[++len]="0";
36                     continue;
37                 }//判断是不是全零
38                 while(s[k]=='0')++k;//删去前缀零
39                 ++len;
40                 for(int h=k;h<=j;++h)num[len]=num[len]+s[h];
41             }
42         }
43     }
44     sort(num+1,num+len+1,cmp);
45     for(int i=1;i<=len;++i)cout<<num[i]<<endl;
46     return 0;
47 }

 

posted on 2020-07-19 17:48  _YueYang  阅读(288)  评论(0)    收藏  举报