2

基数12から基数10に、またはその逆に変換する最も効率的な方法は何ですか?

base^exponent文字列への変換、各文字の値としての割り当て、乗算してそのベースの値を取得し、合計を取得するなど、さまざまな変換方法を試しました。

私は疑問に思っていました、これへのより良いアプローチはありますか?

まず、数値を基数10の文字列として格納しており、別の文字列として基数12に変換したいと思います。また、その基数12の数値(文字列内)を基数10の数値(文字列内)に変換できるようにしたいと思います。

4

1 に答える 1

2

中間体としてベース2を使用するだけであれば、非常に簡単です。次のように、任意の基数の文字列から基数2に変換できます。

int x = strtol("12345", NULL, 10); // convert from base 10 string to integer
int y = strtol("12345", NULL, 12); // convert from base 12 string to integer

次に、基数10に変換するのは簡単です。

sprintf(buf, "%d", y); // convert from integer to base 10 string

12進法で数値を出力するのは少し難しいです-すでにそれを実行する組み込み関数がないので、あなたはあなた自身を書く必要があります(物事をきれいに保つためにいくつかのヘルパーを使って):

void reverse(char *s)                // reverse a string in place
{
    char *e = s + strlen(s) - 1;     // find the end of the string
    char tmp;
    while (s < e)                    // loop to swap characters and move pointers
    {                                // towards the middle of the string
        tmp = *e;
        *e-- = *s;
        *s++ = tmp;    
    }
}

char digit(int x)        // turn an integer into a single digit
{
    if (x < 10)
        return '0' + x;       // 0-9
    else
        return 'a' + x - 10;  // a, b, c, d, e, f, g....
}

void tobase(char *s, int x, int base) // convert an integer into a string in
{                                     // the given base
    int r;
    char *p = s;
    while (x)
    {
        r = x % base;    // extract current digit
        x = x / base;    // divide to get lined up for next digit
        *p++ = digit(r); // convert current digit to character
    }
    *p = '\0';           // null terminate the string
    reverse(s);          // and reverse it, since we generated the digits 
}                        // backwards

あなたはそれを次のように使うでしょう:

tobase(buf, x, 12); // convert from integer to base 12 string

おそらく、私が持っているよりも優れたエラー処理を追加したいと思うでしょう。私は、ここにきれいに収めるために、短い実装を撮影していました。

于 2013-01-05T00:00:10.833 に答える