现在的位置: 首页 > 综合 > 正文

hdu 1228 A + B

2018年05月02日 ⁄ 综合 ⁄ 共 1804字 ⁄ 字号 评论关闭

A + B

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12149    Accepted Submission(s): 7099

Problem Description
读入两个小于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
 

/*题解: 
    代码较长,不过思路很明了,输入整个字符串s,将'+'前的字符串赋值到s1中,'+'后的赋值到s2中。
然后处理s1和s2,首先根据空格的个数以不同形式求出转化后的加数a和b,最后输出a+b。
比赛完看了小郭的代码,更加简洁,用while(scanf("%s",s)&&strcmp(s,"+")!=0)输入数,转换为t后,sum = sum*10+t。 
*/  

#include<cstdio>
#include<cstring>
int f(char *s)
{
    if(s[0]=='z') return 0;
    if(s[0]=='o') return 1;
    if(s[0]=='t'&&s[1]=='w') return 2;
    if(s[0]=='t'&&s[1]=='h') return 3;
    if(s[0]=='f'&&s[1]=='o') return 4;
    if(s[0]=='f'&&s[1]=='i') return 5;
    if(s[0]=='s'&&s[1]=='i') return 6;
    if(s[0]=='s'&&s[1]=='e') return 7;
    if(s[0]=='e') return 8;
    if(s[0]=='n') return 9;
}     
int main()
{
    char s[22],s1[22],s2[22],str1[22],str2[22];
    int len1,len2,i,j,k,t,a,b,ge,shi,st;
    while(gets(s)&&strcmp(s,"zero + zero =")!=0)
    {
        memset(s1,'\0',sizeof(s1));
        memset(s2,'\0',sizeof(s2));
        for(i=0; s[i]!='+'; i++)
        {
            s1[i] = s[i];
        }
        st = i+2;
        s1[i-1] = '\0';
        int len=strlen(s);
        for(i=st,j=0; i<len-2; i++)
        {
            s2[j++] = s[i];
        }
        s2[j]='\0';    
        memset(str1,'\0',sizeof(str1));
        memset(str2,'\0',sizeof(str2)); 
        len1=strlen(s1),len2=strlen(s2);
/**************求'+'前数字和**********************/ 
        t=0;
        for(i=0; i<len1; i++)
        {
            if(s1[i]==' ')
            t++;
        }
        if(t==0)
        {
            a = f(s1);
        }
        if(t==1)
        {
            for(i=0; s1[i]!=' '; i++)
            {
                str1[i] = s1[i];
            }
            st = i+1;
            for(i=st,j=0; i<len1; i++)
            {
                str2[j++] = s1[i];
            } 
            a = f(str1)*10+f(str2);
        }
/**************求'+'后数字和**********************/ 
        t=0;
        for(i=0; i<len2; i++)
        {
            if(s2[i]==' ')
            t++;
        }
        if(t==0)
        {
            b = f(s2);
        }
        if(t==1)
        {
            for(i=0; s2[i]!=' '; i++)
            {
                str1[i] = s2[i];
            }
            str2[i] = '\0';
            st = i+1;
            for(i=st,j=0; i<len2; i++)
            {
                str2[j++] = s2[i];
            }
            b = f(str1)*10+f(str2);
        }
        printf("%d\n",a+b);
    }
    return 0;
}

此题用strtok函数会很好解决。

抱歉!评论已关闭.