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ụ:
10010phải đọc làyi wan ling yi shi, không phảiyi wan ling shi.100000phải đọc làshi wan, không phảiyi shi wan.2000phải đọc làer qian, không phảiliang 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;
}