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