题目描述:
读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出。
输入:
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即A+B的值。
示例输入:
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
示例输出:
3
90
96
解题思路:
这是一个字符串处理类的题目,关键是如何从字符串中提取出数字信息并将这些信息组合成正确的十进制数。观察可得对于输入字符串,我们从左向右进行遍历时,每个数字信息后一位都是空格。通过这个信息可以划分出数字在字符串的区域。同时可以发现,在从左向右遍历时,我们总是先取出一个数的高位上的数,后取出低位上的数。两个数的划分可以通过加号来区分。通过观察0-9每个数的英文单词,可以发现,通过单词的第一位或者前两位就可以区分这10个数字。综上,此题可以解决。
做题感受:
挺有意思的一个题目,不算很难,但使我对字符串处理有了更深刻的认识。自我感觉我的思路不是最优解,太笨了。应该有更好的解决方法。但是现在还没有想到。还是需要更加提升码力才行。
代码:
```cpp
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
char str[30]; //这个题简化了问题,由于是两位数的加减,字符串最多也不会超过27(如99+99=这个英文字符串)
int num[2]={0,0};
int ans;
int position=0;
while(1)
{
scanf("%[^\n]",str);
getchar(); //读入一行数据
for(int i=0;;)
{
if(str[i]=='=') break;
if(str[i]=='+')
{
position++;
i=i+2;
} //加号来区分应该是哪个加数
if(str[i]=='z')
{
num[position]=num[position]*10+0;
i=i+5;
}
else if(str[i]=='o')
{
num[position]=num[position]*10+1;
i=i+4;
}
else if(str[i]=='t'&&str[i+1]=='w')
{
num[position]=num[position]*10+2;
i=i+4;
}
else if(str[i]=='t'&&str[i+1]=='h')
{
num[position]=num[position]*10+3;
i=i+6;
}
else if(str[i]=='f'&&str[i+1]=='o')
{
num[position]=num[position]*10+4;
i=i+5;
}
else if(str[i]=='f'&&str[i+1]=='i')
{
num[position]=num[position]*10+5;
i=i+5;
}
else if(str[i]=='s'&&str[i+1]=='i')
{
num[position]=num[position]*10+6;
i=i+4;
}
else if(str[i]=='s'&&str[i+1]=='e')
{
num[position]=num[position]*10+7;
i=i+6;
}
else if(str[i]=='e')
{
num[position]=num[position]*10+8;
i=i+6;
}
else if(str[i]=='n')
{
num[position]=num[position]*10+9;
i=i+5;
}
else ; //区分0-9
}
if(num[0]==0&&num[1]==0) break;
ans=num[0]+num[1];
printf("%d\n",ans);
num[0]=0;
num[1]=0;
position=0;
}
return 0;
}