HJ42 学英语(递归)

描述
Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:如22:twenty two,123:one hundred and twenty three。

说明:数字为正整数,长度不超过九位,不考虑小数,转化结果为英文小写;输出格式为twenty two;非法数据请返回“error”;关键字提示:and,billion,million,thousand,hundred。
本题含有多组输入数据。

输入描述:输入一个long型整数
输出描述:输出相应的英文写法

示例1
输入:2356
输出:two thousand three hundred and fifty six

参考牛客网哈工大王瑞超理解的解题思路。数字的读法在100以内,每逢10有固定的读法,如果有余数就要读成0-9之间的数字了,比如89,;数字在一千以内的话,需要将百位的数字的读法(数字+hundred)添加到100以内数字的读法上,比如989;数字在一千到一万之间,需要添加千位的读法比如:9989;如果数字大于一万且小于100万,那么万位到百万位的读法就转化成了多少千+小于一千的读法,在多少千这个部分,类似于一百以内的数的读法,比如数字523235。如果数字大于百万呢,在数字小于一万且小于百万的基础上加上百万位的读法,依次类推……是不是像个递归的过程呢?递归的出口有三个条件,数字范围在0-9之间,数字范围在10-20之间,数字范围在20-100之间。

#include <iostream>
#include <string>
using namespace std;

const string ones[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
const string tens[] = { "ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nighteen" };
const string twenties[] = { "zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety" };
const int ihundreds[] = { (int)1e2, (int)1e3, (int)1e6, (int)1e9, (int)1e12 };
const string hundreds[] = { "hundred", "thousand", "million", "billion" };

string itoe(long long n)
{
    if (0<=n && n<=9) return ones[n];
    if (10<=n && n<20) return tens[n%10];
    if (20<=n && n<1e2) return twenties[n/10] + (n%10 ? " " + ones[n%10] : "");
    for (int i=0; i < 5-1; i++) 
        if (n < ihundreds[i+1])  return itoe(n/ihundreds[i]) + " " + hundreds[i] + (n%ihundreds[i] ? (i ? " ": " and ") + itoe(n%ihundreds[i]) : "");
    
    return "";  // ... ...
}

int main()
{
    for (long long N; cin>>N; ) cout<<itoe(N)<<endl;
    return 0;
}

	


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值