C言語関係掲示板

過去ログ

No898 漢数字を数字に変換する関数

[戻る] [ホームページ]
No.581

漢数字→数字
投稿者---たま(2003/10/27 18:33:18)


初めて投稿します。

漢数字を数字に変換する関数を作りたいのですが、
何か良い案はないでしょうか?

例)
六百五十四→654

よろしくお願いします。

No.583

Re:漢数字→数字
投稿者---かずま(2003/10/27 21:29:26)


> 漢数字を数字に変換する関数を作りたいのですが、
> 何か良い案はないでしょうか?

よい案はありません。ただひたすら作るだけです。
不正な入力のチェックが甘いようですが、こんな風に書いてみました。
#include <stdio.h>

int c;  char *bp;

int ktoi4(void)
{
    int i;  char *t = "〇一二三四五六七八九十百千万億";

    for (i = 0; t[i]; i += 2)
        if (t[i] == bp[0] && t[i+1] == bp[1])
            break;
    if (t[i] == 0) return c = -1;
    bp += 2;
    switch (i) {
    case 22: return c = 100;
    case 24: return c = 1000;
    case 26: return c = 10000;
    case 28: return c = 100000000;
    default: return c = i / 2;
    }
}

int ktoi3(void)
{
    int v = -1;
    if (ktoi4() >= 0 && c <= 9) v = c, ktoi4();
    return v;
}

int ktoi2(void)
{
    int v = 0, m, i = ktoi3();
    for (m = 1000; m; m /= 10)
        if (c == m) v += (i < 0) ? c : i * c, i = ktoi3();
    return (i < 0) ? v : v + i;
}

int ktoi(char *buf)
{
    int v = 0, i, m;
    bp = buf;
    i = ktoi2();
    for (m = 100000000; m; m /= 10000)
        if (c == m) v += i * c, i = ktoi2();
    return (i < 0) ? v : v + i;
}

int main(void)
{
    char buf[256];

    while (scanf("%s", buf) == 1) {
        int i = ktoi(buf);
        if (i >= 0) printf("%d\n", i);
    }
    return 0;
}


No.585

Re:漢数字→数字
投稿者---かずま(2003/10/28 10:56:20)


ktoi4() をちょっと修正します。
int ktoi4(void)
{
    static char t[] = "〇一二三四五六七八九十百千万億";
    static int v[] = {0,1,2,3,4,5,6,7,8,9,10,100,1000,10000,100000000};
    int i;

    for (i = 0; t[i]; i += 2)
        if (t[i] == bp[0] && t[i+1] == bp[1]) break;
    if (t[i] == 0) return c = -1;
    bp += 2;
    return c = v[i>>1];
}


No.587

Re:漢数字→数字
投稿者---たま(2003/10/28 13:38:50)


ありがとうございました。

ちょっと、やってみます。