1082. Read Number in Chinese (25)【字符串处理】——PAT (Advanced Level) Practise

题目信息

1082. Read Number in Chinese (25)

时间限制400 ms

内存限制65536 kB

代码长度限制16000 B

Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output “Fu” first if it is negative. For example, -123456789 is read as “Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu”. Note: zero (“ling”) must be handled correctly according to the Chinese tradition. For example, 100800 is “yi Shi Wan ling ba Bai”.

Input Specification:

Each input file contains one test case, which gives an integer with no more than 9 digits.

Output Specification:

For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.

Sample Input 1:

-123456789

Sample Output 1:

Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu

Sample Input 2:

100800

Sample Output 2:

yi Shi Wan ling ba Bai

解题思路

注意细节

AC代码

#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
char num[][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
char step[][5] = {"", "Shi", "Bai", "Qian"};
char bigStep[][5] = {"", "Wan", "Yi"};
vector<string> ans, qans;
void show(string s, bool first)
{
    int i = 0, t = -1;
    while (i < s.size() && ‘0‘ == s[i]) ++i;
    t = i - 1;
    if (i != 0 && (ans.empty() || ans[ans.size() - 1] != "ling")) ans.push_back("ling");
    for (; i < s.size(); ++i){
        if (t + 1 != i) ans.push_back("ling");
        t = i;
        ans.push_back(num[s[i] - ‘0‘]);
        ans.push_back(step[s.size() - 1 - i]);
        while (i + 1 < s.size() && ‘0‘ == s[i + 1]) ++i;
        first = false;
    }
}
int main()
{
    char s[15];
    char *p = s;
    gets(s);
    int len = strlen(s);
    if (s[0] == ‘-‘){
        ans.push_back("Fu");
        --len;
        ++p;
    }
    for (int i = 8; i >= 0; i -= 4){
        if (len > i){
            show(string(p, p + len - i), p == s);
            if (ans[ans.size() - 1] != "ling") ans.push_back(bigStep[i/4]);
            p += len - i;
            len -= len - i;
            if (strspn(p, "0") == len) break;
        }
    }
    for (int i = 0; i < ans.size(); ++i){
        if (ans[i] != "") qans.push_back(ans[i]);
    }
    for (int i = 0; i < qans.size() - 1; ++i){
        printf("%s ", qans[i].c_str());
    }
    printf("%s\n", qans[qans.size() - 1].c_str());
    return 0;
}
时间: 2025-01-08 09:42:07

1082. Read Number in Chinese (25)【字符串处理】——PAT (Advanced Level) Practise的相关文章

1104. Sum of Number Segments (20)【数学题】——PAT (Advanced Level) Practise

题目信息 1104. Sum of Number Segments (20) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence {0.1, 0.2, 0.3, 0.4}, we have 10 segments: (0.1)

PAT 1082. Read Number in Chinese (25)

1082. Read Number in Chinese (25) Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san Bai si

1093. Count PAT&#39;s (25)【计数】——PAT (Advanced Level) Practise

题目信息 1093. Count PAT's (25) 时间限制120 ms 内存限制65536 kB 代码长度限制16000 B The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th c

1082. Read Number in Chinese (25)

题目如下: Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai b

【PAT甲级】1082 Read Number in Chinese (25 分)

题意: 输入一个九位整数,输出它的汉字读法(用拼音表示). trick: 字符串数组""其实会输出一个空格,而不是什么都不输出,导致测试点0和4格式错误. 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int num[17];string united[17]={"","yi","er","san&qu

PAT (Advanced Level) 1082. Read Number in Chinese (25)

模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<iostream> #include<algorithm> using namespace std;

1062. Talent and Virtue (25)【排序】——PAT (Advanced Level) Practise

题目信息 1062. Talent and Virtue (25) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about people's talent and virtue. According to his theory, a man being outstanding i

1066. Root of AVL Tree (25)【AVL树】——PAT (Advanced Level) Practise

题目信息 1066. Root of AVL Tree (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more tha

1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise

题目信息 1067. Sort with Swap(0,*) (25) 时间限制150 ms 内存限制65536 kB 代码长度限制16000 B Given any permutation of the numbers {0, 1, 2,-, N-1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For exa