【C++/模拟】A+B Problem(very easy)(CCSU_ACM 21新生赛)

179 阅读1分钟

题目描述

人之初,A+B。你需要计算一组数字的和,输入通过字符串的形式用小写英语输入。具体操作见样例,题目输入字符串保证不会出现除了小写英文字母、加法符号‘+’、连词符'-'以外的任何符号。

输入描述:

第一行一个整数 T 表示数据的组数,T≤10。
接下来每行一个字符串 SSS ,表示需要进行计算的式子
∣S∣ 表示字符串 SSS 的长度, ∣S∣≤100
a 表示参与运算的单个数字, 0a<100
单词表在备注中给出,输入不会出现单词表以外的词语。

输出描述:

TTT 行,每行一个数表示答案

输入

6
zero
one+two+three+four+five+six+seven+eight+nine+ten
eleven+twelve+thirteen+fourteen+fifteen+sixteen
seventeen+eighteen+nineteen
twenty+thirty+forty+fifty+sixty+seventy+eighty+ninety
ninety-nine+ninety-nine+ninety-nine+ninety-nine+ninety-nine+ninety-nine+ninety-nine+ninety-nine+two

输出

0
55
81
54
440
794

备注:

zero 0
one 1
two 2
three 3
four 4
five 5
six 6
seven 7
eight 8
nine 9
ten 10
eleven 11
twelve 12
thirteen 13
fourteen 14
fifteen 15
sixteen 16
seventeen 17
eighteen 18
nineteen 19
twenty 20
thirty 30
forty 40
fifty 50
sixty 60
seventy 70
eighty 80
ninety 90

思路

单词与数字之间可以用键值对(map)来解决,就是初始化麻烦亿点,要写一大堆。然后读数据的时候通过string类的push_back来逐个存放,如果遇到+或者-,就利用键值对把值加到变量中,然后将存放字符的string利用clear清空。另外这题有个小坑,可能一些人会因为这个WA掉(比如我),就是“-”其实是连词符,并不是减号,所以只用进行加的操作就好了。

AC代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    cin>>t;
    string s;
    
    map<string,int> mp;
    
    mp["zero"]=0;mp["one"]=1;mp["two"]=2;mp["three"]=3;mp["four"]=4;mp["five"]=5;mp["six"]=6;mp["seven"]=7;
    mp["eight"]=8;mp["nine"]=9;mp["ten"]=10;mp["eleven"]=11;mp["twelve"]=12;mp["thirteen"]=13;mp["fourteen"]=14;mp["fifteen"]=15;
    mp["sixteen"]=16;mp["seventeen"]=17;mp["eighteen"]=18;mp["nineteen"]=19;mp["twenty"]=20;mp["thirty"]=30;mp["forty"]=40;mp["fifty"]=50;
    mp["sixty"]=60;mp["seventy"]=70;mp["eighty"]=80;mp["ninety"]=90;
    while(t--)
    {
        cin>>s;
        char tmp='+';
        int sum=0;
        string s1;
        int flag=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!='+'&&s[i]!='-')
            {
                s1.push_back(s[i]);
            }
            else
            {
                sum+=mp[s1];
                tmp=s[i];
                s1.clear();
            }
           
        }
        sum+=mp[s1];//在这里还要进行一次加的操作是因为没有判断最后一个单词
        cout<<sum<<endl;
        
    }
    return 0;
}

//2022.5.10 CCSU_ACM 21新生赛