2 条题解
-
0
此题唯一难在排序。由于数的个数不超过 ,可以使用冒泡排序,排序函数如下:
bool cmp(string a,string b,int Alen,int Blen){ if(Alen!=Blen)return Alen>Blen;//先比较整数部分长度 int len=min(a.size(),b.size()); for(int i=0;i<len;i++){ if(a[i]>b[i])return 1;//大于 if(a[i]<b[i])return 0;//小于 if(a[i]==b[i])continue; } return a.size()>b.size();//全部相同比较长度 } void bubble(){//冒泡排序 for(int i=1;i<cnt;i++){ for(int j=i+1;j<=cnt;j++){ if(cmp(num[i].num,num[j].num,num[i].INTlen,num[j].INTlen)) swap(num[i],num[j]); } } }
对数的处理:
for(int i=0;i<s.size();i++){ if(isdigit(s[i])){ num[cnt].num+=s[i]; if(f==0)num[cnt].INTlen++;//有了小数点不再计入整数部分长度 } else if(s[i]=='.')num[cnt].num+=s[i],f=1;//已有小数点 else if(isdigit(s[i-1]))num[cnt].ALLlen=num[cnt].num.size(),cnt++,f=0;//总长度,是否小数点有变量 f 恢复 }
综合代码如下:
#include<bits/stdc++.h> using namespace std; int cnt=1; string s; bool f; struct node{ int ALLlen,INTlen; string num; }num[10005]; bool cmp(string a,string b,int Alen,int Blen){ if(Alen!=Blen)return Alen>Blen; int len=min(a.size(),b.size()); for(int i=0;i<len;i++){ if(a[i]>b[i])return 1; if(a[i]<b[i])return 0; if(a[i]==b[i])continue; } return a.size()>b.size(); } void bubble(){ for(int i=1;i<cnt;i++){ for(int j=i+1;j<=cnt;j++){ if(cmp(num[i].num,num[j].num,num[i].INTlen,num[j].INTlen)) swap(num[i],num[j]); } } } int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); getline(cin,s); for(int i=0;i<s.size();i++){ if(isdigit(s[i])){ num[cnt].num+=s[i]; if(f==0)num[cnt].INTlen++; } else if(s[i]=='.')num[cnt].num+=s[i],f=1; else if(isdigit(s[i-1]))num[cnt].ALLlen=num[cnt].num.size(),cnt++,f=0; } bubble(); cout<<num[cnt].num; return 0; }
已 AC,请放心
信息
- ID
- 460
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 40
- 已通过
- 24
- 上传者