题解:B4212 [常州市赛 2022] 文本找数

· · 题解

B4212 题解

(新手第一次发题解,如有错误,敬请见谅)

其实这道题只是看着难,把它拆开就简单了:把这道题拆成两部分——读数字与比大小。

1. 读数字

我们不要管什么字符、空格什么的,反正就是看见数字、小数点就读入字符串,有其它的字符就停止读入。
注意读入‌数字位数‌。(若两数相同,数字位数区别‌只在小数部分‌,不用特判

下列代码:

if(isdigit(s[i])) {
    while(isdigit(s[i])||s[i]=='.'&&i<s.length()) {
        going.push_back(s[i]);
        i++;
        item++;
    }
}

(代码中的 going 为 string 类型,i 为 for 循环的 int 型变量,itemplusm 为 int 型变量)

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;
}

谢谢观看!