C言語関係掲示板

過去ログ

No.323.10進整数dをn進数に変換する関数

[戻る] [ホームページ]

No.2007

みなさま
投稿者---えんまる(2002/07/08 11:31:25)


10進整数dをn進数に変換する関数がわかりません。
ただしnが10より大きい場合にも対応し、
インターフェイスは、char* d2q(int d, int n)でおねがいします
関数のなかで入出力を行わずにしたいんです
戻り値は、変換されたn進数をあらわす文字列としたいんです

No.2010

Re:みなさま
投稿者---snow(2002/07/08 16:17:51)


ども、snowです。
以下恐ろしく適当に作りました。


#include<stdio.h>

char fusianasan[80];
void henkan(int amari,int i)
{
        if(amari>=10){
                fusianasan[i]='A'+amari-10;
                printf("%s\n",fusianasan);
        }
        else{
                fusianasan[i]='0'+amari;
        }
}
void d2q(int d, int n){
        int amari,sift;
        for(int i=0;i<80;i++){
                amari=d%n;
                henkan(amari,i);
                d=d/n;
                if(d<n){
                        henkan(d,i+1);
                        break;
                }
        }
}

int main(){
        
        int onaka,ippai;
        scanf("%d",&onaka);
        scanf("%d",&ippai);
        d2q(onaka,ippai);
        printf("%s",fusianasan);
}


No.2035

Re:みなさま
投稿者---かずま(2002/07/10 03:19:40)


> 10進整数dをn進数に変換する関数がわかりません。
> ただしnが10より大きい場合にも対応し、
> インターフェイスは、char* d2q(int d, int n)でおねがいします
> 関数のなかで入出力を行わずにしたいんです
> 戻り値は、変換されたn進数をあらわす文字列としたいんです

ポインタを返す関数の場合、そのポインタが指す実体をどこに確保するかが問題に
なります。ここでは、関数内に static に持っていることにしましょう。
他にも、考えなければならないことがたくさんあります。
n の範囲はいくつまでにしますか。範囲外の値が与えられたらどうしますか。
d が負の場合どうしますか。符号と絶対値に分け、絶対値だけ基数を変換しますか。
それとも、符号無しに変換しますか。ここでは、10進数の場合だけ符号付きにして
みましょう。11進以上の場合、大文字にしますか、小文字にしますか。

質問者の方、あなたなら、これらをどうしますか。
char *d2q(int d, int n)
{
    unsigned int u = d;
    static char  a[33];
    char  b[32];
    int   i = 0, j = 0;
 
    if (n < 2 || n > 36) return "";
    if (n == 10 && d < 0) { a[i++] = '-'; u = -d; }
    do b[j++] = "0123456789abcdefghijklmnopqrstuvwxyz"[u % n]; while (u /= n);
    do a[i++] = b[--j]; while (j > 0);
    a[i] = '\0';
    return a;
}

#include <stdio.h>

int main()
{
    int d, n;

    while (scanf("%d%d", &d, &n) == 2)
        printf("  %s\n", d2q(d, n));
    return 0;
}