牛客网 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 \le n \le 2000000 \1≤n≤2000000 

输入描述:

输入一个long型整数

输出描述:

输出相应的英文写法

示例1

输入:

22

复制输出:

twenty two

复制

我的解答:



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

int main(){

    long long n;
    cin >> n;
    // 低位,0-9,
    string lowDigit[20] = {"zero", "one", "two", "three", "four", "five", "six",
                "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen",
                "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", 
                "nineteen" };
    
    // 十位, 四十用forty,而不是fourty
    string tenDigit[10] = {"0", "1", "twenty", "thirty", "forty", "fifty", "sixty",
                            "seventy", "eighty", "ninety"};
    
    // 关键字提示:and,billion,million,thousand,hundred。
    string keyWord[5] = {"0", "hundred", "thousand", "million", "billian"};


    // 结果
    string result = "";
    // 当前处理的轮数
    int round = 1;
    while(n != 0){
        // 当前处理的最后三位数
        int curThree = n % 1000;

        // 当前三个数字的零时结果
        string curStr = "";
        // 当前三位数字的后边两位数字是多少
        int curTwo = curThree % 100;

        // 倒数第一位
        int lastOne = curThree % 10;
        // 倒数第二位
        int lastTwo = curThree / 10 % 10;
        // 倒数第三位
        int lastThree = curThree / 100;
        if(curTwo >= 1 && curTwo <= 19){
            curStr = lowDigit[curTwo];
        }else if(curTwo >= 20 && curTwo <= 99){
            // 这个时候十位是不会为0的,个位有可能是0
            if(lastOne != 0) {
                curStr = lowDigit[ lastOne ];
                //个位,十位都不是0
                curStr = tenDigit[lastTwo] + ' ' + curStr;
            // 个位有可能是0, 十位肯定不是0
            } else{
                curStr = tenDigit[lastTwo];
            }
        }else if(curTwo == 0){
            // else if( curTwo == 0 ) { } 如果这三位数字的后两位是0,跳过了, curStr就是空字符串
        }
        

        // 如果十位是0,这个"and"要不要加?  似乎是要加, 测试了一下确实要加,但是题目里没说清楚
        if(lastThree != 0){
            // 如果最后两位不是0
            if(curTwo != 0){
                curStr = lowDigit[lastThree] + " hundred and " + curStr;
            }
            else{
                // 可能会带来一个字符串最后一个是空格的问题
                // 当最后两个数字是0的时候,curStr就是空字符串,不必拼接到最后边了
                    // curStr = lowDigit[lastThree] + " hundred " + curStr;  
                curStr = lowDigit[lastThree] + " hundred"; 
                if(round > 1) curStr += ' ';        
            }
        }

        if(round >= 2){
            curStr = curStr + ' ' + keyWord[round] + ' ';
        }

        result = curStr + result;
        n /= 1000;
        round ++;
    }

    cout << result;
    return 0;
}

<think>首先,用户查询是关于“牛客网符串逆序编程题解题方法”。我需要根据系统指令来构建响应。系统指令关键点:-所有行内表达式使用$...$格式(但在这个上下文中,可能不涉及表达式,因为是符串处理)。-独立公式使用$$...$$格式(同样,可能不适用)。-LaTeX语法正确(确保在需要时使用)。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层指令:-回答结构清晰,帮助用户逐步解决问题。-保证回答真实可靠。-参考站内引用:我有系列引用[^1]到[^5],这些是关于符串逆序的编程题解。分析引用:-[^1]:JavaScript解决句子逆序题,涉及符串分割和拼接。-[^2]:C语言刷题,讨论符串逆序的函优化,使其适用于部分逆序。-[^3]:牛客网符串逆序题解,使用指针方法,先逆序每个词再逆序整个符串。-[^4]:简符串逆序输出。-[^5]:Java实现符串逆序,使用组和StringBuilder。用户意图是寻找牛客网符串逆序编程题的解题方法。我需要综合这些引用,提供清晰的解题步骤。结构响应:1.**介绍问题**:简要描述牛客网上的符串逆序编程题。2.**解题方法**:-参考引用,讨论常见方法:简逆序、词级逆序(如句子逆序)。-逐步解释:输入、处理、输出。-使用代码示例(如C,Java,Python),但确保语法正确。3.**生成相关问题**:在末尾添加相关问题。4.**添加引用**:在相关段落末尾自然添加引用标识。可能的解题方法:-**简逆序**:如[^4],输入符串,从后往前输出每个符。-**词级逆序**:如[^1]和[^3],先分割符串成词,逆序词顺序,再拼接(或逆序每个词)。-优化方法:如[^2],使用函进行部分逆序。响应大纲:1.**问题描述**:牛客网上的符串逆序题通常涉及输入一个符串,输出其逆序形式。可能有变体,如句子逆序(词顺序逆序)。2.**常见解法**:-方法1:简逆序(整个符串反转)。-使用循环或内置函。-示例代码(C,Java,Python)。-方法2:句子逆序(逆序词顺序)。-分割符串,逆序词列表,再拼接。-示例代码。-方法3:部分逆序(如逆序特定部分)。-参考[^2],使用指针或索引。3.**逐步指导**:选择一个典型问题,如[^3]或[^4],逐步解释。4.**代码示例**:提供简代码,确保使用正确语言(根据引用,有C,Java,Python)。5.**相关问题**:生成2-3个相关问题。确保使用中文。生成相关问题:1.如何优化符串逆序的性能?2.符串逆序有哪些常见变体?3.在牛客网上解决符串逆序题时需要注意什么?添加引用:当提到具体方法时,在句末添加引用标识。例如,“在C语言中,可以使用指针进行高效逆序[^3]。”最终响应结构:-开头:介绍问题。-主体:分步解题方法,包括代码。-结尾:相关问题。</think>### 牛客网符串逆序编程题解题方法 在牛客网的编程题中,符串逆序是一个常见问题,通常要求输入一个符串(长度在100以内),输出其逆序形式。题目可能有变体,如简逆序整个符串(例如输入 "tsinghua" 输出 "auhgnist"),或句子逆序(逆序词顺序,如输入 "I am a student" 输出 "student a am I")。下面我将基于真实可靠的解题经验(参考牛客网相关题解),逐步解释解题方法,确保结构清晰、易于理解。解题核心在于高效处理符串反转,常见语言包括 C、Java 和 Python。 #### 解题步骤详解 1. **理解问题需求**: - 输入:一个符串,长度通常不超过100(如牛客网题号 HJ106 或类似题目)。 - 输出:逆序后的符串。如果是简逆序,直接反转整个符串;如果是句子逆序,需先分割词再逆序词顺序。 - 关键约束:内存和时间效率(牛客网评测系统对性能敏感),建议使用 $O(n)$ 时间复杂度的算法。 2. **选择解题方法**: - **方法1: 简逆序(整个符串反转)**:适用于题目如“输入符串,输出反序符”(参考引用[4])。思路是遍历符串从末尾到开头。 - **算法步骤**: 1. 输入符串。 2. 获取符串长度 $n$。 3. 从索引 $n-1$ 到 $0$ 遍历,将符逐个添加到新符串或直接输出。 - **代码示例(C语言)**:高效且节省内存。 ```c #include <stdio.h> #include <string.h> int main() { char str[101]; // 假设最大长度100 scanf("%s", str); int len = strlen(str); for (int i = len - 1; i >= 0; i--) { printf("%c", str[i]); // 逆序输出每个符 } printf("\n"); return 0; } ``` - **优点**:简直接,时间复杂度 $O(n)$,空间复杂度 $O(1)$(原地输出)。适用于基础题 [^4]。 - **代码示例(Java)**:使用 StringBuilder 提升效率。 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); StringBuilder sb = new StringBuilder(s); System.out.println(sb.reverse().toString()); // 内置 reverse 方法 } } ``` - **优点**:代码简洁,内置函处理高效 [^5]。 - **方法2: 句子逆序(词顺序反转)**:适用于题目如“输入句子,输出词逆序”(参考引用[1]和[3])。思路是先分割词,再逆序词顺序。 - **算法步骤**: 1. 输入符串。 2. 分割符串成组(以空格为分隔符)。 3. 逆序组(如从后向前遍历)。 4. 拼接词成新符串。 - **代码示例(Python)**:灵活处理符串分割。 ```python def reverse_sentence(s): words = s.split() # 分割词 words.reverse() # 逆序词列表 return ' '.join(words) # 拼接输出 if __name__ == "__main__": s = input().strip() print(reverse_sentence(s)) ``` - **优点**:易于实现,Python 符串方法高效 [^1]。 - **代码示例(C语言)**:使用指针进行原地操作(优化性能)。 ```c #include <stdio.h> #include <string.h> void reverse(char* start, char* end) { // 辅助函:逆序部分符串 while (start < end) { char tmp = *start; *start = *end; *end = tmp; start++; end--; } } int main() { char str[101]; gets(str); // 输入符串 char* cur = str; while (*cur) { char* start = cur; while (*cur != ' ' && *cur != '\0') cur++; reverse(start, cur - 1); // 逆序当前词 if (*cur != '\0') cur++; // 移动到下一个词 } reverse(str, str + strlen(str) - 1); // 逆序整个符串 printf("%s\n", str); return 0; } ``` - **优点**:避免额外内存,适用于复杂场景(如部分逆序)[^3]。 3. **优化与注意事项**: - **性能优化**:避免使用高开销操作(如多次符串拼接)。在 C 语言中,指针方法减少拷贝;在 Java/Python 中,使用 StringBuilder 或列表推导提升速度 [^2][^5]。 - **边界处理**:考虑空符串、空格开头/结尾等情况(牛客网测试用例常包含边界值)。 - **语言选择**:牛客网支持多语言,C 适合性能敏感题,Java/Python 代码更简洁。 - **调试技巧**:在牛客网提交时,注意输入输出格式(如使用 `scanf` 代替 `gets` 避免缓冲区溢出)[^4]。 通过以上方法,您可以高效解决牛客网符串逆序题。核心是选择合适算法:简逆序用循环或内置函,句子逆序先分割再逆序。真实题解显示,这些方法在牛客网评测中通过率较高 [^1][^3][^5]。 #### 相关问题 1. 如何优化符串逆序算法以处理超长符串(长度超过1000)? 2. 符串逆序题在牛客网中有哪些常见变体(如逆序特定子串)? 3. 在Java或Python中,符串逆序的内置方法(如 `StringBuilder.reverse()`)是如何实现的? 如果您有具体题目链接或代码问题,我可以进步分析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值