UVa486 - English-Number Translator

#include <iostream>
#include <fstream>
#include <cstdio>
#include <sstream>
#include <algorithm>
#include <string>
#include <map>
#include <sstream>
#include <iomanip>
#include <vector>
#include <iterator>

using namespace std;

void init();

map<string, int> m;

int find_num(vector<string> v, int b, int e);

int main()
{
	vector<string> v;
	vector<string>::iterator pos, million_pos, thousand_pos;
	string str, tmp;


#ifndef ONLINE_JUDGE
	ifstream cin("d:\\OJ\\uva_in.txt");
#endif

	init();

	while (getline(cin, str)) {
		istringstream line(str);
		v.clear();
		while (line >> tmp) {
			v.push_back(tmp);
		}

		//copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
		//cout << endl;

		million_pos = find(v.begin(), v.end(), "million");
		thousand_pos = find(v.begin(), v.end(), "thousand");

		pos = find(v.begin(), v.end(), "negative");
		if (pos != v.end()) {
			cout << "-";
		}

		if (million_pos == v.end()) {
			if (thousand_pos == v.end()) {


				cout << find_num(v, 0, v.size()) << endl;

			} else {
				cout << find_num(v, 0, distance(v.begin(), thousand_pos));
				cout << setfill('0') << setw(3) << find_num(v, distance(v.begin(), thousand_pos) + 1, v.size());
				cout << endl;
			}
		} else {
			if (thousand_pos == v.end()) {
				cout << find_num(v, 0, distance(v.begin(), million_pos));
				cout << "000";
				cout << setfill('0') << setw(3) << find_num(v, distance(v.begin(), million_pos) + 1, v.size());
				cout << endl;
			} else {
				cout << find_num(v, 0, distance(v.begin(), million_pos));
				cout << setfill('0') << setw(3) << find_num(v, distance(v.begin(), million_pos) + 1, distance(v.begin(), thousand_pos));
				cout << setfill('0') << setw(3) << find_num(v, distance(v.begin(), thousand_pos) + 1, v.size()) << endl;
			}
		}

	}
	return 0;
}

void init()
{
	m["zero"] = 0;
	m["one"] = 1;
	m["two"] = 2;
	m["three"] = 3;
	m["four"] = 4;
	m["five"] = 5;
	m["six"] = 6;
	m["seven"] = 7;
	m["eight"] = 8;
	m["nine"] = 9;
	m["ten"] = 10;
	m["eleven"] = 11;
	m["twelve"] = 12;
	m["thirteen"] = 13;
	m["fourteen"] = 14;
	m["fifteen"] = 15;
	m["sixteen"] = 16;
	m["seventeen"] = 17;
	m["eighteen"] = 18;
	m["nineteen"] = 19;
	m["twenty"] = 20;
	m["thirty"] = 30;
	m["forty"] = 40;
	m["fifty"] = 50;
	m["sixty"] = 60;
	m["seventy"] = 70;
	m["eighty"] = 80;
	m["ninety"] = 90;

}

int find_num(vector<string> v, int b, int e)
{
	vector<string>::iterator begin, end, pos;
	int ans = 0;

	begin = end = v.begin();
	advance(begin, b);
	advance(end, e);

	pos = find(begin, end, "hundred");

	if (pos == end) {

		for (vector<string>::iterator i = begin; i != end; i++) {
			ans += m[*i];
		}
	} else {

		for (vector<string>::iterator i = begin; i != pos; i++) {
			ans += m[*i] * 100;
		}

		for (vector<string>::iterator i = pos + 1; i != end; i++) {
			ans += m[*i];
		}

	}

	return ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值