fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MS 1000
  5.  
  6. const char oneDigit[][10] = {"Không", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu", "Bảy", "Tám", "Chín"};
  7. const char base[][10] = {"", "Mươi", "Trăm", "Nghìn", "Mươi", "Trăm", "Triệu", "Mươi", "Trăm", "Tỷ"};
  8.  
  9. int checkString(char s[]) {
  10. for (int i = 0; i < strlen(s); i++)
  11. if (s[i] < '0' || s[i] > '9')
  12. return 0;
  13. return 1;
  14. }
  15.  
  16. char *preWord(const char s[]) {
  17. static char word[10] = {0};
  18. int size = strlen(s);
  19. int i = size - 1, j = 0;
  20. while (s[i--] != ' ');
  21. while (s[i--] != ' ');
  22. i += 2;
  23. while(s[i] != ' ' && s[i] != '\0') {
  24. word[j++] = s[i++];
  25. }
  26. word[j] = '\0';
  27. return word;
  28. }
  29.  
  30. char *d2w(const char number[]) {
  31. static char word[MS];
  32. word[0] = 0;
  33. char s[MS] = {0};
  34. int size = strlen(number);
  35. if (size == 0 || !checkString(number))
  36. return NULL;
  37. for (int i = 0; i < size; i++)
  38. s[i] = number[i] - '0';
  39. if (size == 1) {
  40. strcpy(word, oneDigit[(int)s[0]]);
  41. return word;
  42. }
  43. for (int i = 0, j = size - 1; i < j; i++, j--) {
  44. char t = s[i];
  45. s[i] = s[j];
  46. s[j] = t;
  47. }
  48. while (s[size - 1] == 0) {
  49. size--;
  50. }
  51. for (int i = size - 1; i >= 0; i--) {
  52. int k = i;
  53. while (k >= 10) {
  54. k -= 9;
  55. }
  56. if (!strcmp(oneDigit[(int)s[i]], "Không") && !strcmp(base[k], "Mươi") && s[i - 1] != 0)
  57. strcat(word, "Linh ");
  58. else if (!strcmp(oneDigit[(int)s[i]], "Một") && !strcmp(base[k], "Mươi"))
  59. strcat(word, "Mười ");
  60. else if (s[i] != 0 || (!strcmp(base[k], "Trăm") && (s[i - 2] != 0 || s[i - 1] != 0))) {
  61. if (s[i] == 5 && ((i == 0 || s[i + 1] == 1)) && strcmp(preWord(word), "Linh")) {
  62. strcat(word, "Lăm");
  63. strcat(word, " ");
  64. } else if (s[i + 1] > 1 && s[i] == 1 && i % 3 == 0)
  65. strcat(word, "Mốt ");
  66. else if (s[i] == 4 && (!strcmp(preWord(word), "Mươi")))
  67. strcat(word, "Tư ");
  68. else {
  69. strcat(word, oneDigit[(int)s[i]]);
  70. strcat(word, " ");}
  71. strcat(word, base[k]);
  72. strcat(word, " ");
  73. } else if (((i % 3 == 0) && (s[i + 1] != 0 || s[i + 2] != 0)) || (!strcmp(base[k - 6], "Nghin"))) {
  74. strcat(word, base[k]);
  75. strcat(word, " ");
  76. }
  77. }
  78. return word;
  79. }
  80.  
  81. int main() {
  82. //system("chcp 65001");
  83. char s[MS];
  84. while (fscanf(stdin, "%s", s) != EOF) {
  85. int k = 0;
  86. while (s[k] == '0') {
  87. k++;
  88. }
  89. for (int i = k; i < strlen(s); i++)
  90. printf("%c", s[i]);
  91. printf(" in words is: %s\n", d2w(s));
  92. }
  93. return 0;
  94. }
  95.  
Success #stdin #stdout 0s 9432KB
stdin
1000005
1010000
15
125
120
110
115
105
2001
1234567
5005105
5015110
2010000
2010
5555555
1050
5
25
1054
001
sda
1000001011111
1000001000000001
015121
21
231251251
24
14
4
34
stdout
1000005 in words is: Một Triệu Không Trăm Linh Năm  
1010000 in words is: Một Triệu Không Trăm Mười Nghìn 
15 in words is: Mười Lăm  
125 in words is: Một Trăm Hai Mươi Lăm  
120 in words is: Một Trăm Hai Mươi  
110 in words is: Một Trăm Mười  
115 in words is: Một Trăm Mười Lăm  
105 in words is: Một Trăm Linh Năm  
2001 in words is: Hai Nghìn Không Trăm Linh Một  
1234567 in words is: Một Triệu Hai Trăm Ba Mươi Tư Nghìn Năm Trăm Sáu Mươi Bảy  
5005105 in words is: Năm Triệu Không Trăm Linh Năm Nghìn Một Trăm Linh Năm  
5015110 in words is: Năm Triệu Không Trăm Mười Lăm Nghìn Một Trăm Mười  
2010000 in words is: Hai Triệu Không Trăm Mười Nghìn 
2010 in words is: Hai Nghìn Không Trăm Mười  
5555555 in words is: Năm Triệu Năm Trăm Năm Mươi Năm Nghìn Năm Trăm Năm Mươi Lăm  
1050 in words is: Một Nghìn Không Trăm Năm Mươi  
5 in words is: Năm
25 in words is: Hai Mươi Lăm  
1054 in words is: Một Nghìn Không Trăm Năm Mươi Tư  
1 in words is: Một  
sda in words is: (null)
1000001011111 in words is: Một Nghìn Không Trăm Linh Một Triệu Không Trăm Mười Một Nghìn Một Trăm Mười Một  
1000001000000001 in words is: Một Triệu Không Trăm Linh Một Tỷ Không Trăm Linh Một  
15121 in words is: Mười Lăm Nghìn Một Trăm Hai Mươi Mốt  
21 in words is: Hai Mươi Mốt  
231251251 in words is: Hai Trăm Ba Mươi Mốt Triệu Hai Trăm Năm Mươi Mốt Nghìn Hai Trăm Năm Mươi Mốt  
24 in words is: Hai Mươi Tư  
14 in words is: Mười Bốn  
4 in words is: Bốn
34 in words is: Ba Mươi Tư