题解 | #学英语#

学英语

http://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc

首先处理小于1000的情况,对于大于1000的数字,递归调用处理每一级别。

#include <iostream>
#include <sstream>

using namespace std;

string tens[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
string ones[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
                "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                "nineteen"};
string others[] = {"", "thousand", "million", "billion"};
int scopes[] = {1, 1000, 1000000, 1000000000};


string convert(int num) {
    int lower;
    int hundred;
    stringstream ss;

    // 处理小于1000的情况
    if (num <= 19) return ones[num];
    if (num >= 20 && num <= 99) return tens[num / 10] + ((num % 10 > 0)? " " + ones[num % 10] : "");
    if (num >= 100 && num <= 999) {
        ss << ones[num / 100] << " hundred";
        if (num % 100 > 0) {
            ss << " and " << convert(num % 100);
        }
        return ss.str();
    }

    // 处理大于1000的情况
    for(int i=3; i>= 0; i--) {
        if (num > scopes[i]) {
            ss << convert(num / scopes[i]) << " " << others[i];
            num %= scopes[i];
            // 后续仍然有数字
            if (num > 0) {
                ss << ' ';
            }
        }
    }
    return ss.str();
}

int main() {
    int num;

    while(cin >> num) {
        getchar();
        cout << convert(num) << endl;
    }
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务