C言語関係掲示板

過去ログ

No.539.3進数、4進数、5進数などの求め方

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

進数
投稿者---takasi(2003/01/20 13:13:04)


初歩的な事だと思いますが3進数、4進数、5進数などの求め方を教えてください。

No.4494

Re:進数
投稿者---kamadoma(2003/01/20 22:09:25)


2進数の求め方を提示しておきます
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char henkan(int amari);
char *reverse(char *p_temp);

int main(void)
{
    char strValue[256];
    int shou;
    int amari;
    char temp[256];
    char result[256];
    int i;

    /* 10進数を入力させる */
    printf("10進数を入力してください-->");
    gets(strValue);

    i = 0;
    while(1)
    {
        /* 商と余りを求める*/
        shou  = atoi(strValue) / 2;
        amari = atoi(strValue) % 2;

        /* 余りを格納する*/
        temp[i] = henkan(amari);
        i++;

        /* 商を次に割られる数にする*/
        sprintf(strValue,"%d",shou);
    
        /*脱出条件*/
        if(shou == 0){
            break;
        }
    }

    temp[i] = '\0';

    /* 逆順に出力すれば、欲しい結果になる */
    strcpy(result,reverse(temp));

    printf("result = %s\n",result);

    
    return 0;
}

char *reverse(char *p)
{
    static char work[256];
    int len;
    int j;

    len = strlen(p);
    p = p + len -1;

    for(j=0;len>0;p--,j++,len--){
        work[j] = *p;
    }

    work[j]='\0';

    return work;
}

char henkan(int amari)
{
    switch(amari)
    {
        case 0:
            return '0';
        case 1:
            return '1';
        case 2:
            return '2';
        case 3:
            return '3';
        case 4:
            return '0';
        case 5:
            return '1';
        case 6:
            return '2';
        case 7:
            return '3';
        case 8:
            return '2';
        case 9:
            return '3';
    }
}

>初歩的な事だと思いますが3進数、4進数、5進数などの求め方を教えてください。


No.4496

Re:進数
投稿者---カンナ(2003/01/20 22:58:24)
http://hana.sakura.ne.jp/~elfin/k/


 補足。

 小数部は基数を掛けることで求められます。n回掛けたときに整数部に
繰り上がってきた値が小数第n位の数字になります。次に基数を掛ける前
に整数部を払っておいた方が求めやすいでしょう。

 例えば42.195を7進数に変換する場合:

整数部 = 42→60 (求め方は省略。一目瞭然という気もする。)
小数第1位 = 0.195 * 7 = 1.365 → 1 (整数部の値)
小数第2位 = 0.365 * 7 = 2.555 → 2 (0.365は上の1.365の小数部)
小数第3位 = 0.555 * 7 = 3.885 → 3
小数第4位 = 0.885 * 7 = 6.195 → 6
小数第5位 = 0.195 * 7 = 1.365 → 1

 以下循環小数となり、答えは60.12361236…(以降1236の繰り返し)です。

No.4495

Re:進数
投稿者---かずま(2003/01/20 22:45:46)


#include <stdio.h>

void put(unsigned int x, unsigned int base)
{
    if (x >= base) put(x / base, base);
    putchar("0123456789ABCDEF"[x % base]);
}

int main(void)
{
    unsigned int x;

    while (scanf("%u", &x) == 1) {
        printf(" ");
        put(x, 2);  printf("(2) ");
        put(x, 3);  printf("(3) ");
        put(x, 4);  printf("(4) ");
        put(x, 5);  printf("(5) ");
        put(x, 8);  printf("(8) ");
        put(x, 10); printf("(10) ");
        put(x, 16); printf("(16)\n");
    }
    return 0;
}


No.4497

Re:進数
投稿者---かずま(2003/01/20 23:10:56)


再帰呼び出し (recursive call) は嫌いだ。
いきなり出力するのもいやだ。文字列で返して欲しい。
と思ったら、
#include <stdio.h>
#include <limits.h>

void conv(char *s, unsigned int x, unsigned int base)
{
    char buf[sizeof(int) * CHAR_BIT], *p = buf;
    do *p++ = "0123456789ABCDEF"[x % base]; while (x /= base);
    do *s++ = *--p; while (p != buf);
    *s = '\0';
}

int main(void)
{
    unsigned int x;  char buf[80];

    while (scanf("%u", &x) == 1) {
        conv(buf, x, 2);  printf(" %s(2)", buf);
        conv(buf, x, 3);  printf(" %s(3)", buf);
        conv(buf, x, 4);  printf(" %s(4)", buf);
        conv(buf, x, 5);  printf(" %s(5)", buf);
        conv(buf, x, 8);  printf(" %s(8)", buf);
        conv(buf, x, 10); printf(" %s(10)", buf);
        conv(buf, x, 16); printf(" %s(16)\n", buf);
    }
    return 0;
}