[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 ...
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++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | //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