洛谷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 }
浙公网安备 33010602011771号