首先看一下题
描述
Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:
具体规则如下:
1.在英语读法中三位数字看成一整体,后面再加一个计数单位。从最右边往左数,三位一单位,例如12,345 等
2.每三位数后记得带上计数单位 分别是thousand, million, billion.
3.公式:百万以下千以上的数 X thousand X, 10亿以下百万以上的数:X million X thousand X, 10 亿以上的数:X billion X million X thousand X. 每个X分别代表三位数或两位数或一位数。
4.在英式英语中百位数和十位数之间要加and,美式英语中则会省略,我们这个题目采用加上and,百分位为零的话,这道题目我们省略and
下面再看几个数字例句:
22: twenty two
100: one hundred
145: one hundred and forty five
1,234: one thousand two hundred and thirty four
8,088: eight thousand (and) eighty eight (注:这个and可加可不加,这个题目我们选择不加)
486,669: four hundred and eighty six thousand six hundred and sixty nine
1,652,510: one million six hundred and fifty two thousand five hundred and ten
说明:
数字为正整数,不考虑小数,转化结果为英文小写;
保证输入的数据合法
关键字提示:and,billion,million,thousand,hundred。
数据范围: 1≤n≤2000000
输入描述:
输入一个long型整数
输出描述:
输出相应的英文写法
示例1
输入:
22
复制输出:
twenty two
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:
2.具体规则如下:(1)在英语读法中三位数字看成一整体,后面再加一个计数单位。从最右边往左数,三位一单位,例如12,345等
(2)每三位数后记得带上计数单位分别是thousand,million,billion.
(3)公式:百万以下千以上的数X thousand X,10亿以下百万以上的数:X million X thousand X, 10亿以上的数:X billion X million X thousand X. 每个X分别代表三位数或两位数或一位数。
(4)在英式英语中百位数和十位数之间要加and,美式英语中则会省略,我们这个题目采用加上and,百分位为零的话,这道题目我们省略and
3.下面再看几个数字例句:
22: twenty two
100: one hundred
145: one hundred and forty five
1,234: one thousand two hundred and thrity four
8,088: eight thousand (and) eighty eight(注:这个and可加可不加,这个题目我们选择不加)
486,669: four hundred and eighty six thousand six hundred and sixty nine
1,652,510: one million six hundred and fifty two thousand five hundred and ten
4.说明:数字为正整数,不考虑小数,转化结果为英文小写;
5.保证输入的数据合法
6.关键字提示:and ,billion, million, thousand, hundred。
7.数据范围:n大于等于1小于等于两百万
8.输入描述:输入一个long型整数
9.输出描述:输出相应的英文写法
二、解题思路
1.首先我们接受数字n,
2.然后我们将数字分组,从后往前,每3个一组
3.分组之后我们对每组的三个数字进行处理
4.百万组后面加million,千组后面加thousand
三、具体步骤
使用的语言是C
cpp
#include <stdio.h>
static char base[][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
static char baseTen[][8] = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
static char unit[][10] = {"", " thousand", " million"};
int main(int argc, char** argv) {
int input, data[3];
while(scanf("%d", &input) != EOF) {
if(input == 0) {
printf("%s", base[0]);
continue;
}
unsigned char flag = 0;
for (int i = 0; i < 3; i++) {
// 通过对1000求余得到后三位数字
// i=0储存个位数,i=1储存千,i=2储存百万
data[i] = input % 1000;
if(data[i]) {
// flag 逻辑或运算便于之后判断是否需要加单位
flag = flag | 0x1 << i;
}
input /= 1000;
}
for(int i = 2; i >= 0; i--) {
if(data[i] / 100) {
// 如果百位不是0
printf("%s hundred", base[data[i] / 100]);
data[i] %= 100;
// 如果十位个位有数字
if(data[i] % 100) {
printf(" and ");
}
}
if(data[i] >= 20) {
printf("%s", baseTen[data[i]/10 - 2]);
data[i] %= 10;
// 如果个位还有数字,预留一个空格
if(data[i]) {
printf(" ");
}
}
if(data[i]) {
printf("%s", base[data[i]]);
}
//如果标记过
if(flag & (0x1 << i)) {
printf("%s", unit[i]);
flag &= ~(0x1 << i);
// 取消标记
// 如果后面还有数字,预留出来空格
if(flag) {
printf(" ");
}
}
}
}
return 0;
}