- ベストアンサー
n進数の値を10進数の値に変換するには?
こんにちは。 C言語において、n進数の値を10進数の値に変換する方法を考えています。 例えば、2進数の101を、10進数で表すと5になります。 これを関数化し、 n_to_m(int x, unsigned n); といったプロトタイプで、 渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。 逆に、10進数の値を、n進数の値に変換する関数も一緒に作りたいと考えています。 何かいい方法を思いついた方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>n_to_m(int x, unsigned n); といったプロトタイプで、 >渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。 変換後の10進数を戻り値とする必要がありそうであるのと、 n_to_mという名前では何のことやらよくわからなそうなので、 こんなプロトタイプがいいのではないかと思います。 int toDecimal(int x, unsigned int n); 1)変換結果を格納する変数を0で初期化する。 2)変換元が0でない間、2-1)~2-3)を繰り返す。 2-1)変換元を10で割った剰余がn未満ならば、変換結果に加える。 2-2)変換元を10で割った剰余がn以上ならば、変換元の数値をn進数で表現できないため、 エラーとする。エラー時の戻り値をどうするかは考えてみてください。 2-3)変換元を10で割った商を、新たな変換元とする。 3)求めた変換結果を呼び出し元へ返す。 こんなところでしょうか。
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
何進数というのは、数値の表記方法にすぎません。 ですので、n進数で表記された文字列を10進数で表記された文字列に変換するということならわかります。 実現するには次のようにします。 const char* src = "101"; char *endptr; int radix = 2; errno = 0; intmax_t value = strtoimax(src, &endptr, radix); if (errno != 0 || *endptr != '\0') { /* エラー処理 */ } char result[CHAR_BIT*sizeof(value)/3+1]; snprintf(result, sizeof(result), "%jd", value);
お礼
御回答ありがとうございます。 strtoimaxやsnprinfといった関数の存在ははじめて知りました。 是非参考にさせていただきます。
お礼
御回答ありがとうございます。 >n_to_mという名前では何のことやらよくわからなそうなので、 こんなプロトタイプがいいのではないかと思います。 すみません。n_to_10の間違いでした。 アドバイスして頂いたアルゴリズムを参考にして、 何とか作成する事ができました。 ありがとうございました。