本题主要考察字符串的操作。思路是使用substr来截取数字对应的字符串。

比如

one + two =

three four + five six =

情况1:通过对str.find("+")来获取加号的位置,再配合size来截取可分别把one、two分别截取出来赋给front,rear。再根据数组对应得到数字即可。此为字符串长度小于6的情况即只有一个数字。

情况2:有两个数字。那么截取到的是"three four",由于题目限制了小于100,那么只需要再通过对“ ”的发现位置然后配合size再进行一次截取,即可获得两个单独的数字。

#include <iostream>
#include <string>

using namespace std;
string num[10]={"zero","one","two","three","four","five","six","seven","eight","nine"};

int StringToInt(string str){   //通过数组映射字符串对应的数字
    for(int i=0;i<10;i++){
        if(str==num[i])
            return i;
    }
    return 0;
}

int Trans(string str){   // 将该操作整合成函数,避免函数冗余
    
    int empty = str.find(' ');
    int size = str.size();
    return StringToInt(str.substr(0,empty))*10 + StringToInt(str.substr(empty+1,size-empty-1));
}

int main(){
    string str;
    while(getline(cin,str)){
        int plus = str.find("+");    //寻找加号
        int size = str.size();
        string front = str.substr(0,plus-1);            //对前后的截取,如果不好找,可以边打印出来边修改
        string rear = str.substr(plus+2,size-plus-4);
        int left,right;
        if(front.size()<6){              
            left = StringToInt(front);
        }else{
            left = Trans(front);
        }
        if(rear.size()<6){
            right = StringToInt(rear);
        }else{
            right = Trans(rear);
        }
        int ans = left+right;
        if(ans==0)break;   //0则退出
            else           //否则打印
                cout << ans <<endl;  
    }
    return 0;
}