Chuyển Đổi Số Thành Phiên Âm Tiếng Trung

Trong xử lý dữ liệu gen, các nhà khoa học thường làm việc với các chuỗi số rất lớn, có thể lên tới hàng trăm triệu hoặc thậm chí hàng tỷ. Việc đọc trực tiếp những con số như vậy là điều không dễ dàng. Do đó, cần thiết kế một chương trình giúp chuyển đổi số thành phiên âm tiếng Trung chuẩn xác.

Ví dụ: số 1234567009 sẽ được đọc là:

十二亿三千四百五十六万七千零九

Phiên âm Hán Việt tương ứng:

shi er yi san qian si bai wu shi liu wan qi qian ling jiu

Yêu cầu bài toán

  • Nhập vào một số nguyên không vượt quá 2,000,000,000.
  • Xuất ra phiên âm tiếng Trung của số đó bằng chữ Latin thường, mỗi từ cách nhau bởi một dấu cách.
  • Tuân thủ nghiêm ngặt quy tắc phát âm tiếng Trung. Ví dụ:
    • 10010 phải đọc là yi wan ling yi shi, không phải yi wan ling shi.
    • 100000 phải đọc là shi wan, không phải yi shi wan.
    • 2000 phải đọc là er qian, không phải liang qian.

Ví dụ

<strong>Input:</strong>
1234567009

<strong>Output:</strong>
shi er yi san qian si bai wu shi liu wan qi qian ling jiu

Ý tưởng giải thuật

Số đầu vào có thể chia thành ba nhóm 4 chữ số:

  • Nhóm tỷ (tỷ): phần cao nhất, tối đa 2 chữ số.
  • Nhóm vạn (vạn): nhóm tiếp theo, tối đa 4 chữ số.
  • Nhóm đơn vị (đơn): nhóm cuối cùng, tối đa 4 chữ số.

Ví dụ: số 1234567899 được chia như sau:

  • Tỷ: 12
  • Vạn: 3456
  • Đơn: 7899

Việc xử lý từng nhóm này sẽ được thực hiện bởi hàm phụ trợ chuyên trách.

Cài đặt

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

string digits[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string units[] = {"", "shi", "bai", "qian"};

void processGroup(int number, bool isFirst, bool hasHigher) {
    if (number == 0) return;

    vector<int> parts(4, 0); // thousand, hundred, ten, unit
    int temp = number;
    for (int i = 3; i >= 0; --i) {
        parts[i] = temp % 10;
        temp /= 10;
    }

    bool leadingZeroHandled = false;
    if (!isFirst && hasHigher) {
        cout << "ling ";
    }

    for (int i = 0; i < 4; ++i) {
        if (parts[i] != 0) {
            cout << digits[parts[i]] << " ";
            if (i < 3) cout << units[3 - i] << " ";
        } else {
            bool needZero = false;
            if (i == 1 || i == 2) { // Hundred or Ten position
                for (int j = 0; j < i; ++j)
                    if (parts[j] != 0) needZero = true;
                if (needZero && !leadingZeroHandled) {
                    cout << "ling ";
                    leadingZeroHandled = true;
                }
            }
        }
    }
}

int main() {
    int input;
    cin >> input;

    int billions = input / 100000000;
    int thousands = (input % 100000000) / 10000;
    int rest = input % 10000;

    bool printed = false;

    if (billions > 0) {
        processGroup(billions, true, (thousands > 0 || rest > 0));
        cout << "yi ";
        printed = true;
    }

    if (thousands > 0) {
        processGroup(thousands, !printed, rest > 0);
        cout << "wan ";
        printed = true;
    } else if (billions > 0 && rest > 0) {
        cout << "ling ";
    }

    if (rest > 0) {
        processGroup(rest, !printed, false);
    }

    cout << endl;
    return 0;
}

Thẻ: cpp number-conversion chinese-numerals string-processing

Đăng vào ngày 5 tháng 10 lúc 04:05