A + B ------[NWPU][2018寒假作业][通用版]一、热身 [Cloned]E题

读入两个小于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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值