■ アラビア数字を漢数字表記にする
/*
* arb2knj.c : アラビア数字を漢数字表記にする
*
* Copyright (c) 2002 AOK.
*
* 2002.09.10 - 初版
*
* #入力可能なのは半角数字(0-9)のみです。
*
*/
#include <stdio.h>
#include <string.h>
#define ISSEN 1 /* 千の前に一を入れるかどうか */
const char *suuji[] = {
"〇", "一", "二", "三", "四",
"五", "六", "七", "八", "九",
};
const char *keta[] = {
"〇",
"一", "十", "百", "千",
"万", "十", "百", "千",
"億", "十", "百", "千",
"兆", "十", "百", "千",
};
char *arabia2kanji(const char *arb, char *knj)
{
unsigned i, kt1, kt2, num, len, flag;
char *sav = knj;
*knj = '\0';
flag = 0;
len = strlen(arb);
if (len < sizeof(keta)/sizeof(keta[0])) {
for (i=0; i<len; i++) {
num = *(arb+i) - '0'; /* 数値 */
kt1 = len - i; /* 桁位置 */
kt2 = kt1 % 4;
if (num && (num > 1 || kt2 == 1
#if ISSEN
|| kt2 == 0
#endif
)) {
strcat(knj, suuji[num]);
flag = 1;
}
if (kt1 > 1 && (num || kt2 == 1)) {
if (flag || num == 1) {
strcat(knj, keta[kt1]);
flag = 1;
}
}
if (kt2 == 1) flag = 0;
}
}
return sav;
}
int main()
{
char buf[256], src[127];
int n;
while (fgets(src, 127, stdin) && src[0] && src[0] != '\n') {
n = strlen(src);
if (src[n - 1] == '\n') src[n - 1] = '\0';
printf("%10s -> %s\n", src, arabia2kanji(src, buf));
}
return 0;
}
/*
0 ->
1 -> 一
10 -> 十
100 -> 百
1000 -> 一千
1111 -> 一千百十一
90000 -> 九万
10000000 -> 一千万
685 -> 六百八十五
34000 -> 三万四千
190687 -> 十九万六百八十七
100000108 -> 一億百八
10001001 -> 一千万一千一
2147483647 -> 二十一億四千七百四十八万三千六百四十七
1234567890 -> 十二億三千四百五十六万七千八百九十
*/