Bailian3713 外星人翻译用数字转换模块【递归+映射】

3713:外星人翻译用数字转换模块
总时间限制: 1000ms 内存限制: 65536kB
描述
外星人为了了解地球人,需要将地球上所有的语言转换为他们自己的语言,其中一个小模块是要将地球
上英语语言中的英文文字表达的数字转换为外星人也理解的阿拉伯数字。请你为外星人设计这个模块,
即给定一个用英文表达的整数,你的任务是去转换这些数成为阿拉伯整数表达法。这些数的范围从-999,999,999到+999,999,999。下列单词是你的程序中将遇到的所有有关数目的英文单词。
negative, zero, one, two, three, four, five, six, seven, eight,
nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen,
seventeen, eighteen, nineteen, twenty, thirty, forty, fifty, sixty,
seventy, eighty, ninety, hundred, thousand, million
输入
输入由几个表示数目的英文单词组成。注意:负号将由单词negative表示;
当数的大小超过千时,并不用完全单词hundred表示。例如1600 将被写为“one thousand six hundred", 而不是“sixteen hundred"
输出
每个答案单独占一行。
样例输入
six
negative seven hundred twenty nine
one million one hundred one
eight hundred fourteen thousand twenty two
样例输出
6
-729
1000101
814022

问题链接Bailian3713 外星人翻译用数字转换模块
问题简述:(略)
问题分析
    这个问题是将英文说的数字转换为阿拉伯数字输出,用递归实现是比较方便的,也需要用到映射表。
    这个题跟参考链接的题是同一个题,解题代码就直接拿过来用了。
程序说明:(略)
参考链接UVA486 English-Number Translator【递归+映射】
题记:(略)

AC的C++语言程序如下:

/* UVA486 English-Number Translator */

#include <bits/stdc++.h>

using namespace std;

const string word[] = {"negative", "zero", "one", "two", "three", "four", "five", "six", "seven",
                 "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
                 "sixteen", "seventeen", "eighteen", "nineteen",
                 "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "hundred",
                 "thousand", "million"};
const int value[] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
                20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 1000000};
const int N = 20;
string s[N];

int find(string s)
{
    for(int i = 1; i < 29; i++)
        if(word[i] == s)
            return value[i];
    return -1;
}

int convert(int start, int end)
{
    int sum = 0, million = 0, thousand = 0, hundred = 0;
    if(start == end)
        return find(s[start]);
    else {
        for(int i = start; i <= end; i++) {
            if(s[i] == "million")
                million = i;
            else if(s[i] == "thousand")
                thousand = i;
            else if(s[i] == "hundred")
                hundred = i;
            sum += find(s[i]);
        }

        if(million)
            return convert(start, million - 1) * 1000000 + convert(million + 1, end);
        else if(thousand)
            return convert(start, thousand - 1) * 1000 + convert(thousand + 1, end);
        else if(hundred)
            return convert(start, hundred - 1) * 100 + convert(hundred + 1, end);

        return sum;
    }
}

int main()
{
    while(cin >> s[0]) {
        int cnt = 1;
        while(getchar() != '\n')
            cin >> s[cnt++];
        if(s[0] == "negative")
            printf("-%d\n", convert(1, cnt - 1));
        else
            printf("%d\n", convert(0, cnt - 1));
    }

    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值