기수(基數) 변환

han.user();·2023년 2월 25일
0

알고리즘

목록 보기
2/6
post-thumbnail

2진수 8진수 16진수 라는 말에서
앞에 2 8 16과 같은 n값이 '기수'이다.

아마 기준이나 기초가 되는 숫자라는 뜻 같은데...🤔

이런식으로 몫이 0이 될때까지 기수 n으로 계속 나눈다.
그리고 그 나머지를 거꾸로 나열한 숫자가 기수로 변환한 숫자이다.

위 그림에서는 마지막 몫 1은 따로 나누지 않았는데 한번 더 2로 나누어도
결과는 같다. 하지만 난 0이 될 때까지 나누는거로 기억해야 될 것 같다.

8진법 16진법도 동일하나, 그 중 16진법은 9다음이 10이 아니라 A인거를 기억하자.

10진수의 정수를 기수 변환하는 코드

(출처:Do it! 알고리즘 입문 - 자바편)

dchar라는 문자열에서 해당문자를 꺼내 d[digits]에 저장합니다.
해당 과정은 x가 0이 될 때까지 반복됩니다.

static int cardConv(int x, int r, char[] d) {
        int digits = 0;  // 변환 뒤 자리수
        String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        do {
            d[digits++] = dchar.charAt(x % r);  // r로 나눈 나머지를 저장
            x /= r;
        } while (x != 0);

하지만 이렇게 나머지를 구하는 순서대로 넣어두면 맨 앞에 아랫자리가 배치되므로,
바로 이어서 역순으로 정렬까지 해주도록 합니다. (배열 역순 정렬)

for (int i = 0; i < digits / 2; i++) {    // 배열 d의 숫자 문자열을 역순 정렬
            char t = d[i];
            d[i] = d[digits - i - 1];
            d[digits - i - 1] = t;
 		}

전체코드

package DataStructureBasic;

// 입력받은 10진수를 2진수 ~ 36진수로 기수 변환하여 출력

import java.util.Scanner;

class CardConv {
    //--- 정수값 x를 r진수로 변환하여 배열 d에 아랫자리부터 넣어 두고 자리수를 반환 ---//
    static int cardConv(int x, int r, char[] d) {
        int digits = 0;  // 변환 뒤 자리수
        String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        do {
            d[digits++] = dchar.charAt(x % r);  // r로 나눈 나머지를 저장
            x /= r;
        } while (x != 0);

        for (int i = 0; i < digits / 2; i++) {  // 배열 d의 숫자 문자열을 역순 정렬
            char t = d[i];
            d[i] = d[digits - i - 1];
            d[digits - i - 1] = t;
        }

        return digits;
    }

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int no;                       // 변환할 정수
        int cd;                       // 기수 선택
        int dno;                      // 변환 뒤 자리수
        int retry;                    // 다시 한 번 할래?
        char[] cno = new char[32];    // 변환 후 각 자리의 숫자를 넣어 두는 문자 배열

        System.out.println("10진수의 정수를 기수 변환합니다.");
        do {
            do {
                System.out.print("변환하는 음이 아닌 정수: ");
                no = stdIn.nextInt();
            } while (no < 0);

            do {
                System.out.print("어떤 진수로 변환할까요?(2-36): ");
                cd = stdIn.nextInt();
            } while (cd < 2 || cd > 36);

            dno = cardConv(no, cd, cno);  // no를 cd진수로 변환

            System.out.print(cd + "진수로 ");
            for (int i = 0; i < dno; i++)  // 순서대로 표시
                System.out.print(cno[i]);
            System.out.println("입니다.");

            System.out.print("다시 한 번 할까요? (1…예/0…아니오): ");
            retry = stdIn.nextInt();
        } while (retry == 1);
    }
}
profile
I'm still hungry.

0개의 댓글