【C言語】10進数から2進数変換のアルゴリズム(基本情報技術者試験 令和元年度 春 午前 問1)

  • このエントリーをはてなブックマークに追加

「基本情報技術者試験 令和元年度 春 午前 問1」の10進数を2進数変換のアルゴリズムをC言語で実装した。次の通りである。
10進数の99は2進数の1100011になる。

環境
windows10(64bit)
Borland C++ 5.5.1 for Win32

binary(名)2進数

次のコードをBinary.cとする。


#include <stdio.h>

void decimalToBinary(int j) {
	
	int NISHIN[8]; //10進整数j(0<j<100)を格納する配列
	int k;
	
	// 10進数を2進数に変換
	for (k = 0; k < 8; k++) {
		printf("j = %d ", j);
		NISHIN[k] = j % 2;
		printf("NISHIN[%d] = %d\n", k, NISHIN[k]);
		j = j / 2;
	}
	
	printf("2進数: ");
	
	// 2進数を8桁目から順に出力する。
	for (k = 7; k >= 0; k--) {
		printf("%d", NISHIN[k]);
	}
	
	printf("\n");
	
}

int main() {
    int decimal;

    do {
        printf("0より大きく100未満の10進数を入力してください: ");
        scanf("%d", &decimal);

        // 範囲外の場合は再入力を促す
        if (decimal <= 0 || decimal >= 100) {
            printf("入力が範囲外です。\n");
        }
    } while (decimal <= 0 || decimal >= 100);

    printf("入力された数値: %d\n", decimal);
	
    decimalToBinary(decimal);

    return 0;
}


コンパイルして実行する。


c:\coco_c>Binary.exe
0より大きく100未満の10進数を入力してください: 200
入力が範囲外です。
0より大きく100未満の10進数を入力してください: 13
入力された数値: 13
j = 13 NISHIN[0] = 1
j = 6 NISHIN[1] = 0
j = 3 NISHIN[2] = 1
j = 1 NISHIN[3] = 1
j = 0 NISHIN[4] = 0
j = 0 NISHIN[5] = 0
j = 0 NISHIN[6] = 0
j = 0 NISHIN[7] = 0
2進数: 00001101
c:\coco_c>

10進数の13が2進数00001101となる。頭の0が不要だよな。この0を除去したい。
コードを改造する。


#include <stdio.h>

void decimalToBinary(int j) {
	
	int NISHIN[8]; //10進整数j(0<j<100)を格納する配列
	int i,k=0;
	
	// 10進数を2進数に変換
	while (j > 0) {
		printf("j = %d ", j);
		NISHIN[k] = j % 2;
		printf("NISHIN[%d] = %d\n", k, NISHIN[k]);
		j = j / 2;
		k += 1;
	}
	
	printf("2進数: ");
	
	// 2進数を8桁目から順に出力する。
	for (i = k-1; i >= 0; i-=1) {
		printf("%d", NISHIN[i]);
	}
	
	printf("\n");
	
}

int main() {
    int decimal;

    do {
        printf("0より大きく100未満の10進数を入力してください: ");
        scanf("%d", &decimal);

        // 範囲外の場合は再入力を促す
        if (decimal <= 0 || decimal >= 100) {
            printf("入力が範囲外です。\n");
        }
    } while (decimal <= 0 || decimal >= 100);

    printf("入力された数値: %d\n", decimal);
	
    decimalToBinary(decimal);

    return 0;
}

コンパイルして実行する。


c:\coco_c>bcc32 Binary.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Binary.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\coco_c>Binary.exe
0より大きく100未満の10進数を入力してください: 200
入力が範囲外です。
0より大きく100未満の10進数を入力してください: 13
入力された数値: 13
j = 13 NISHIN[0] = 1
j = 6 NISHIN[1] = 0
j = 3 NISHIN[2] = 1
j = 1 NISHIN[3] = 1
2進数: 1101

c:\coco_c>

int型で入力可能な数字の最大値は2147483647である。
2147483647が入力できるようにコードを改造する。


#include <stdio.h>

void decimalToBinary(int j) {
	
	int NISHIN[31]; //10進整数j(0<j<100)を格納する配列
	int i,k=0;
	
	// 10進数を2進数に変換
	while (j > 0) {
		printf("j = %d ", j);
		NISHIN[k] = j % 2;
		printf("NISHIN[%d] = %d\n", k, NISHIN[k]);
		j = j / 2;
		k += 1;
	}
	
	printf("2進数: ");
	
	// 2進数を8桁目から順に出力する。
	for (i = k-1; i >= 0; i-=1) {
		printf("%d", NISHIN[i]);
	}
	
	printf("\n");
	
}

int main() {
    int decimal;

	//printf("0より大きく4294967297以下の10進数を入力してください: ");
        //scanf("%d", &decimal);
	
	
    do {
        printf("0より大きく4294967297以下の10進数を入力してください: ");
        scanf("%d", &decimal);

        // 範囲外の場合は再入力を促す
        if (decimal <= 0 || decimal > 2147483647) {
            printf("入力が範囲外です。\n");
        }
    } while (decimal <= 0 || decimal > 2147483647);
	
	
	printf("入力された数値: %d\n", decimal);
	
    decimalToBinary(decimal);

    return 0;
}

コンパイルして実行する。
コンパイルすると警告が出るのがよく分からない。
推測だけど4294967297がint型の上限値だからなのか?
うーん。この警告を出すのがダメとか言う人いるよな。
10進数の4294967297を2進数にすると1111111111111111111111111111111になる。
1111111111111111111111111111111は31桁ある。


c:\coco_c>bcc32 Binary.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Binary.c:
警告 W8008 Binary.c 51: 条件が常に真(関数 main )
警告 W8008 Binary.c 54: 条件が常に真(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

c:\coco_c>Binary.exe
0より大きく4294967297以下の10進数を入力してください: 2147483647
入力された数値: 2147483647
j = 2147483647 NISHIN[0] = 1
j = 1073741823 NISHIN[1] = 1
j = 536870911 NISHIN[2] = 1
j = 268435455 NISHIN[3] = 1
j = 134217727 NISHIN[4] = 1
j = 67108863 NISHIN[5] = 1
j = 33554431 NISHIN[6] = 1
j = 16777215 NISHIN[7] = 1
j = 8388607 NISHIN[8] = 1
j = 4194303 NISHIN[9] = 1
j = 2097151 NISHIN[10] = 1
j = 1048575 NISHIN[11] = 1
j = 524287 NISHIN[12] = 1
j = 262143 NISHIN[13] = 1
j = 131071 NISHIN[14] = 1
j = 65535 NISHIN[15] = 1
j = 32767 NISHIN[16] = 1
j = 16383 NISHIN[17] = 1
j = 8191 NISHIN[18] = 1
j = 4095 NISHIN[19] = 1
j = 2047 NISHIN[20] = 1
j = 1023 NISHIN[21] = 1
j = 511 NISHIN[22] = 1
j = 255 NISHIN[23] = 1
j = 127 NISHIN[24] = 1
j = 63 NISHIN[25] = 1
j = 31 NISHIN[26] = 1
j = 15 NISHIN[27] = 1
j = 7 NISHIN[28] = 1
j = 3 NISHIN[29] = 1
j = 1 NISHIN[30] = 1
2進数: 1111111111111111111111111111111

c:\coco_c>

2147483647は実は素数
2^31-1 = 2147483647

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*