题解:B4212 [常州市赛 2022] 文本找数
B4212 题解
(新手第一次发题解,如有错误,敬请见谅)
其实这道题只是看着难,把它拆开就简单了:把这道题拆成两部分——读数字与比大小。
1. 读数字
我们不要管什么字符、空格什么的,反正就是看见数字、小数点就读入字符串,有其它的字符就停止读入。
注意读入数字位数。(若两数相同,数字位数区别只在小数部分,不用特判)
下列代码:
if(isdigit(s[i])) {
while(isdigit(s[i])||s[i]=='.'&&i<s.length()) {
going.push_back(s[i]);
i++;
item++;
}
}
(代码中的
2. 比大小
这里推荐使用 stod()函数,将 string 转化 double(后称新值)来比较最大值。有两个比较逻辑:
新值比最大值大时:
if(stod(going)>stod(nums)) {
nums=going;
plusm=item;
}
新值等于最大值时,比较位数:
if(stod(going)==stod(nums)) {
if(item>plusm) {
nums=going;
plusm=item;
}
}
最后直接输出字符串即可。(用双精度输出实在闲)
温馨提示:每次循环后记得清空位数计数器和临时字符串!
AC 代码
#include<bits/stdc++.h>
using namespace std;
int plusm=-1;
string nums="-1";
int main(){
int item=0;
string s,going="";
getline(cin,s);
for(int i=0;i<int(s.length());i++) {
if(isdigit(s[i])) {
while(isdigit(s[i])||s[i]=='.'&&i<s.length()) {
going.push_back(s[i]);
i++;
item++;
}
if(stod(going)>stod(nums)) {
nums=going;
plusm=item;
}
else if(stod(going)==stod(nums)) {
if(item>plusm) {
nums=going;
plusm=item;
}
}
going.clear();
item=0;
}
}
cout << nums;
return 0;
}
谢谢观看!