华为机试HJ42 学英语

首先看一下题

描述

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;
}
相关推荐
格林威35 分钟前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
高工智能汽车2 小时前
棱镜观察|极氪销量遇阻?千里智驾左手服务吉利、右手对标华为
人工智能·华为
程序员莫小特2 小时前
老题新解|大整数加法
数据结构·c++·算法
小刘max4 小时前
深入理解队列(Queue):从原理到实践的完整指南
数据结构
过往入尘土4 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.4 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
蒙奇D索大4 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
洲覆4 小时前
C++ 模板、泛型与 auto 关键字
开发语言·数据结构·c++
MoRanzhi12034 小时前
15. Pandas 综合实战案例(零售数据分析)
数据结构·python·数据挖掘·数据分析·pandas·matplotlib·零售
智驱力人工智能5 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测