题目链接:http://acm.zju.edu.cn/show_problem.php?pid=2971
解题心得:
1,用scanf("%d",&i)接受整型后,再用gets接受带空格的字符串之前要调用getchar将/n滤掉
2,用关键字是字符串的map时要用string类型
#include <stdio.h>
#include <map>
#include <vector>
#include <string>
using namespace std;
map<string,int> times;
map<string,int> str2int;
vector<string> number;
string str[] = {"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"};
void Input()
{
number.clear();
string temp;
char input[128];
gets(input);
int i;
for(i = 0;input[i] != '/0';i++)
{
if(input[i] != ' ')
{
temp += input[i];
}
else
{
number.push_back(temp);
temp = "";
}
}
number.push_back(temp);
}
void Init()
{
int i;
for(i = 0;i <= 20;i++)
str2int[str[i]] = i;
int j;
for(i = 21,j = 30;i < 28;i++,j += 10)
str2int[str[i]] = j;
times[string("and")] = 1;
times[string("hundred")] = 100;
times[string("thousand")] = 1000;
times[string("million")] = 1000000;
}
void Work()
{
int size = number.size();
int i,temp,result;
for(i = 0,temp = 0,result = 0;i < size;i++)
{
if(times.find(number[i]) != times.end())
{
temp *= times[number[i]];
if(number[i] == "million" || number[i] == "thousand")
{
result += temp;
temp = 0;
}
}
else
{
temp += str2int[number[i]];
}
}
result += temp;
printf("%d/n",result);
}
int main(int argc, char* argv[])
{
Init();
int count;
scanf("%d",&count);
getchar();
while(count >= 1)
{
Input();
Work();
count--;
}
return 0;
}