[pat题解]1005.Spell It Right(map+reduce)

pat 1005.spell it right.
题目给定一个非负的整数,要求把每一位上的数字相加,得到一个和,然后把这个和从高位到低位翻译成英文单词,1对应one,2对应two,3对three,0对应zero,这样依次将每一位表示成一个单词,输出。
给定的这个整数小于等于10^100次方,所以超出了数据类型int的表示范围,所以注意处理,另外题目中说明是非负整数,所以这就要考虑到临界条件0的处理,因为面临着所有位数求和以及逐位翻译为英文,所以使用map/reduce可以非常方便的解决问题,这里的python就使用map/reduce解决。下面是python和c++代码。

python代码:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from functools import reduce

dic = {'1': 'one', '2': 'two', '3': 'three', '4': 'four', '5': 'five',
       '6': 'six', '7': 'seven', '8': 'eight', '9': 'nine', '0': 'zero'}

if __name__ == '__main__':
    s = input()
    sum_digits = reduce(lambda x, y: int(x) + int(y), s)

    sum_digits = str(sum_digits)
    e_digits = list(map(lambda x: dic[x], sum_digits))

    res = ''
    for i in range(len(e_digits)):
        res += ' '
        res += e_digits[i]
    print(res[1:])

c++代码:

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <climits>
#include <string.h>
#include <string>

using namespace std;

string dict[] = { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" };

int main()
{
    string snum;
    cin >> snum;

    int len = snum.length();
    int sum = 0;
    for (int i = 0; i < len; ++i)
    {
        sum += (snum[i] - '0');
    }

    if (sum == 0)
    {
        cout << "zero" << endl;
        return 0;
    }

    string res = "";
    while (sum != 0)
    {
        res = ' ' + res;
        res = dict[sum % 10] + res;
        sum /= 10;
    }
    
    res.pop_back();

    cout << res << endl;
    return 0;
}

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:[pat题解]1005.Spell It Right(map+reduce)

本文链接地址:http://www.iaccepted.net/algorithm/pat/66.html

相关文章



发表评论

电子邮件地址不会被公开。 必填项已用*标注