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

杭电ACM–1228 A+B

2018年06月06日 ⁄ 综合 ⁄ 共 1071字 ⁄ 字号 评论关闭

Problem Description

读入两个小于100的正整数A和B,计算A+B,需要注意的是:A和B的每一位数字由对应的英文单词给出


Input

测试输入包含若干测试用例,每个测试用例占一行,格式为"A
+ B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.


Output

对每个测试用例输出1行,即A+B的值.


这题没有什么算法,纯粹是字符串的操作。

总体而言本题有两类做法:1、用scanf读取,因为每个字符后面都有空格,读取完每组字符串后判断此字符串的含义。2、gets一次读取一整行,直接判断至结尾。


其实这题用scanf更容易些,不过一开始想复杂了用了gets,代码如下:

#include<stdio.h>
#include <string.h>
int n10(int n,int len)
{
    int i;
    for(i=1;i<len;i++)
    {
        n=n*10;
    }
    return n;
}

 int main()
{
    char a[10000],temp[10];
    char *num[10]={"zero","one","two","three","four","five","six","seven","eight","nine"};
    while(gets(a))
    {
        int i,n=1,j=0,m,word1=0,word2=0,num1[100],num2[100],len1=0,len2=0;

        for(i=0;a[i]!='+';i++)
        {
            if(a[i]!=' ')
            {
                temp[j]=a[i];
                j++;
            }
            else
            {
                temp[j]='\0';
                for(m=0;m<10;m++)
                if(!strcmp(temp,num[m]))
                {
                    num1[len1]=m;
                    len1++;
                    j=0;
                    break;
                }
            }
        }
        for(m=0;m<len1;m++)
        {
            word1=word1+n10(num1[m],len1-m);
        }

        i=i+2;
        j=0;
         for(;a[i]!='=';i++)
        {
            if(a[i]!=' ')
            {
                temp[j]=a[i];
                j++;
            }
            else
            {
                temp[j]='\0';
                for(m=0;m<10;m++)
                if(!strcmp(temp,num[m]))
                {
                    num2[len2]=m;
                    len2++;
                    j=0;
                    break;
                }
            }
        }
        for(m=0;m<len2;m++)
        {
            word2=word2+n10(num2[m],len2-m);
        }
        if(word1==0&&word2==0)return 0;
        else printf("%d\n",word1+word2);


    }
    return 0;
}

抱歉!评论已关闭.