[C++] Đọc số thành chữ – hàng triệu

1. Đề bài Đọc số thành chữ

Nhập vào số nguyên dương N (0<=N<=9999999), hãy đọc số N thành chữ và theo chuẩn Tiếng Việt.

Ví dụ:

N = 123 -> mot tram hai muoi ba

N = 2016 -> hai nghin khong tram muoi sau

N = 1200000 -> mot trieu hai tram nghin

N = 1005001 -> mot trieu khong tram le nam nghin khong tram le mot

2. Code đọc số thành chữ – hàng triệu c++

//16521215_Bai106
#include <iostream>
using namespace std;

const char mau[10][7] = { "khong ","mot ","hai ","ba ","bon ","nam ",
"sau ", "bay ", "tam ","chin " };

int c[10];
long n;
//1.234.567

void get(int vt)
{
    if (vt == 7) return;
    switch (vt)
    {
    case 1: cout << "trieu ";
        break;
    case 4:
        if (!((c[vt] == 0) && (c[vt - 1] == 0) && (c[vt - 2] == 0)))
        cout << "nghin ";
        break;
    case 2:
        if (!(((c[vt + 2] == 0) && (c[vt + 1] == 0)) && (c[vt] == 0)))
            cout << "tram ";
        break;
    case 5:
        if (!(((c[vt + 2] == 0) && (c[vt + 1] == 0)) && (c[vt] == 0)))
            cout << "tram ";
        break;

    case 3: case 6:
        if (c[vt] != 0)
            cout << "muoi ";
        else
        {
            if (c[vt + 1] != 0)
                cout << "le ";
        }
        break;
    }
}

void so_to_mang() // chuyển số nguyên sang mảng
{
    int i;
    for (i = 1; i <= 7; i++)
        c[i] = 0;
    i = 7;
    while (n != 0)
    {
        c[i] = n % 10;
        n = n / 10;
        i--;
    }
}

void docso(long n)
{
    so_to_mang();
    int vtd = 8, i;
    for (i = 1; i <= 7; i++)
        if (c[i] != 0)
        {
            vtd = i;
            break;
        }
    if (vtd == 8)
    {
        cout << "khong";
        return;
    }
    for (i = vtd; i <= 7; i++)
    {
        //1.234.567
        switch (c[i])
        {
        case 1: case 2: case 3: case  4: case  6: case 7: case 8: case 9:
            if (!((c[i] == 1) && ((i == 6) || (i == 3))))
                cout << mau[c[i]];
            get(i);
            break;
        case 5:
            if (i == 7)
            {
                if (c[i - 1] == 0)
                    cout << "nam ";
                else
                    cout << "lam ";
            }
            else
            {
                if (i == 4)
                {
                    if (c[i - 1] == 0)
                        cout << "nam ";
                    else
                        cout << "lam ";
                }
                else
                    cout << mau[c[i]];
                get(i);
            }
            break;
        case 0:
            if (((i == 5) || (i == 2)) && ((c[i + 2] != 0) || ((c[i + 1] != 0))))
                cout << mau[c[i]];
            get(i);
            break;
        }
    }
}

void nhapdl() // nhập dữ liệu và kiểm tra input vào
{
    do {
        cout << "Nhap N = ";
        cin >> n;
        if ((n < 0) || (n > 9999999))
            cout << "Vui long nhap lai N! (0<=N<=9999999)." << endl;
    } while (!((n >= 0) && (n <= 9999999)));
}

int main()
{
    nhapdl();
    docso(n);
    cout << endl;
    system("pause");
    return 0;
}

Do Tiếng Việt khá phong phú, nên bài này gần như không có cách tổng quát, vì thế việc đặt điều kiện và kiểm soát các trường hợp đặc biệt là cách duy nhất có thể làm. Đoạn code trên có thể chưa kiểm soát hết các trường hợp đặc biệt, nên chỉ mang tính chất tham khảo. Nếu các bạn tìm được test sai, vui lòng comment dưới đây để mình fix lại đoạn code.

3. Test mẫu cần chú ý

Một số test bạn cần kiểm tra nếu chưa AC:

1000005

1010000

15

125

120

110

115

105

2001

1234567

5005105

5015110

2010000

2010

5555555

 

Bài 106: Giáo trình bài tập kỹ thuật lập trình

One thought on “[C++] Đọc số thành chữ – hàng triệu

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *