读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为”A + B =”,相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
Output
对每个测试用例输出1行,即A+B的值.
Sample Input
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
Sample Output
3
90
96
解题思路:
直接读入整个公式,再从头到尾把单词提取出来,每提取一个单词,就把它转换成数字,并记录加号的位置和总单词数,方便确定个位和十位。
注意事项:
每次只提取一个单词存在numstr中,这样可以节省内存空间,把所有单词都提取出来再处理浪费时间和空间。
注意每处理完一个公式后的初始化,和很多单词共用一个存储空间时短单词不能覆盖原来长单词的问题。
#include<stdio.h>
#include<string.h>
char onetonine[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"};//和输入字符串中的单词比较
//二维数组要用双引号
int main()
{
char formula[30]={0};//公式A+B=,需要初始化
char numstr[6]={0};//num为A和B的个位和十位,必须初始化否则可能有乱码
int num[5];//把单词转换成数字后存在这里
int i,j;
int cnt;//记录一共有几个单词
int add;//加号在哪个单词之后
int result;//记录结果
while(1)
{
gets(formula);
cnt=0;//对于每一个新的公式,单词数都为0
i=0;
while(formula[i]!='=')
//把输入公式中的所有单词提取出来,放到 numstr中。并记录单词个数和加号位置。
{
if(formula[i]>=97&&formula[i]<=122)//一个字母是一个单词的开始
{
cnt++;//单词数加1
j=0;//numstr从0开始
while(formula[i]>=97&&formula[i]<=122)
{
numstr[j++]=formula[i];//将单词存到numstr[]中
i++;
}
//抹去numstr后面残留的上一个单词的字符
if(j==3)
{
numstr[3]=0;
numstr[4]=0;
}
if(j==4)
{
numstr[4]=0;
}
//跟标准字符串比较,确定单词代表的数字
for(int k=0;k<=10;k++)
{
if(strcmp(numstr,onetonine[k])==0)
{
num[cnt]=k;
break;
}
}
}
if(formula[i]==43)//找到加号
{
add=cnt;//记录当前单词个数,即为加号前有多少个单词
}
i++;
}
if(num[1]==0&&num[2]==0)
{
return 0;
}
else//完成计算
{
if(add==1&&cnt==2)
{
result=num[1]+num[2];
printf("%d\n",result);
}
else if(add==1&&cnt==3)
{
result=num[1]+num[3]+num[2]*10;
printf("%d\n",result);
}
else if(add==2&&cnt==3)
{
result=num[1]*10+num[2]+num[3];
printf("%d\n",result);
}
else if(add==2&&cnt==4)
{
result=num[1]*10+num[2]+num[3]*10+num[4];
printf("%d\n",result);
}
}
}
return 0;
}