PDA

View Full Version : Chuyển số ra chữ



khangle
23-10-2003, 14:22
Xin hỏi bạn nào có thể chỉ mình giải thuật để chuyển số thành chữ (tiếng Anh hoặc Việt) có thể chạy được trên số lớn hơn 10 chữ số.

VD: 134 ->one hundred and thirty four.

Cảm ơn nhiều nhe:)

kendax
23-10-2003, 14:57
Bạn lập trình trên ngôn ngữ nào dzậy? Có thể cho anh em biết được không? Nếu biết thì có thể dễ giúp bạn được hơn.

khangle
23-10-2003, 15:23
Ngôn ngữ lập trình nào không quan trọng, mình chỉ cần biết thuật giải thế nào thôi. :)

Jammy
23-10-2003, 15:50
Java code

String[] millionsName = {
"",
" thousand",
" million",
" billion",
" trillion",
" quadrillion",
" quintillion"
};

String[] tensNames = {
"",
" ten",
" twenty",
" thirty",
" fourty",
" fifty",
" sixty",
" seventy",
" eighty",
" ninety"
};

String[] numNames = {
"",
" one",
" two",
" three",
" four",
" five",
" six",
" seven",
" eight",
" nine",
" ten",
" eleven",
" twelve",
" thirteen",
" fourteen",
" fifteen",
" sixteen",
" seventeen",
" eighteen",
" nineteen"
};

String convertLessThanOneThousand(int number) {
String soFar;

if (number % 100 < 20){
soFar = numNames[number % 100];
number /= 100;
}
else {
soFar = numNames[number % 10];
number /= 10;

soFar = tensNames[number % 10] + soFar;
number /= 10;
}
if (number == 0) return soFar;
return numNames[number] + " hundred" + soFar;
}

String convert(int number) {
/* special case */
if (number == 0) { return "zero"; }

String prefix = "";

if (number < 0) {
number = -number;
prefix = "negative";
}

String soFar = "";
int place = 0;

do {
int n = number % 1000;
if (n != 0){
String s = convertLessThanOneThousand(n);
soFar = s + majorNames[place] + soFar;
}
place++;
number /= 1000;
} while (number > 0);

return (prefix + soFar).trim();
}

Hope this help

khangle
24-10-2003, 06:26
Cảm ơn nhiều nhe jammy. Bài của bạn rất dễ hiểu và đơn giản. :)
Có điều mảng majorNames[] là mảng chứa cái gì? Theo mình nghĩ thì bạn đánh lộn tên mảng millionsName thành majorNames rồi.

Jammy
24-10-2003, 08:38
Sorry nha. đánh lộn tên đó đổi millionName thành majorNames là ok.

nkkha
30-07-2011, 20:23
Giải thuật thì mình có một bài viết khá chi tiết tại đây: http://kakalia.co.cc/2010/03/giai-thuat-doi-tu-so-sang-chu-tieng-viet/

Tuy nhiên, với các con số cực lớn, bạn có thể dùng nó như là một string, và thực hiện cắt chuỗi (tức phép chia cho 10 sẽ là cắt 1 chữ số, còn phép chia cho 1000 sẽ tương đương với cắt 3 chữ số), sau đó convert chữ số dạng string đó thành số nguyên và thực hiện các bước tiếp theo...

Chúc bạn thành công.

dauhalan88
19-08-2011, 10:58
bạn ơi có thuật toán nào mà ngắn hơn dễ hơn được không

master_lam
05-12-2011, 21:54
Cám ơn bạn nhiều lắm