杭电ACM--1228 A+B

本文介绍了一种解决特定问题的方法:如何通过解析英文描述的数字字符串并计算它们的和。利用C语言实现了一个程序,该程序能够读取形如“one two three”等英文描述的数字,并将其转换为数值进行加法运算。

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值