[알고리즘]기수 변환 프로그램(n진수 문제)

재키·2020년 3월 15일
0

알고리즘

목록 보기
1/4
post-thumbnail

본 글은 Bohyoh Shibata의 "자료구조와 함께 배우는 알고리즘 입문(자바편)"을 참고하여 작성하였습니다.

n진수란?

n진수는 n을 기수*로 하는 수입니다.

기수란?

기수는 수를 나타내는 데 기초가 되는 수로, 10진법에서는 0에서 9까지의 정수를 말합니다. 서수는 사물의 순서를 나타내는 수입니다. 기수는 일, 이, 삼 ... 이고, 서수는 첫째, 둘째, 셋째 ... 라고 생각하면 됩니다(같은 책 p.65)

10진수

10진수(Decimal)은 아래 10종류의 숫자를 사용하여 수를 나타냅니다.

0 1 2 3 4 5 6 7 8 9

8진수

8진수(Octal)은 아래 8종류의 숫자를 사용하여 수를 나타냅니다.

0 1 2 3 4 5 6 7
이 숫자를 모두 사용하면 자릿수가 한 자리 올라가 10이 되고, 그 다음 수는 11이 됩니다. 2자리의 숫자는 10부터 시작하여 77까지입니다. 이 2자리의 수를 모두 사용하면 그 다음수는 100이 됩니다. 즉 아래처럼 됩니다.
1의 자리 ... 0부터 7까지; 8종류의 수를 나타냅니다.
~2의 자리 ... 0부터 77까지; 64종류의 수를 나타냅니다.
~3의 자리 ... 0부터 777까지; 512종류의 수를 나타냅니다.
예) 5306 = 5(8^3) + 3(8^2) + 0(8^1) + 6(8^0) => 5306를 8진수로 변환하면 5306(정수 상수로는 05306으로 표기)으로 나타낼 수 있습니다.

정수 상수(integer constants)의 n진수 표현 방법

정수 상수는 정수 계열의 값을 나타내는 10진수(기수 10), 8진수(기수 8) 또는 16진수(기수 16)를 말합니다. 정수 상수는 변경할 수 없는 정숫값을 나타낼 때 사용합니다. 정수 상수가 0x 또는 0X로 시작되는 경우는 16진수이고, 숫자 0으로 시작되는 경우는 8진수입니다. 두 경우에 해당하지 않으면 10진수로 간주합니다. 아래 코드의 값은 같습니다.

0x1c: 10진수 28에 대한 16진수 표기
034: 10진수 28에 대한 8진수 표기

코드

1) cardConvRev

import java.util.Scanner;

class CardConvRev {
	// 정숫값 x를 r진수를 변환하여 배열 d에 아랫자리부터 넣어두고 자릿수를 반환합니다.
	static int cardConvR(int x, int r, char[] d) {
        int n = ((Integer) x).toString().length(); // 변환 전의 자릿수
    	int digits = 0; // 변환 후의 자릿수
        String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        
        System.out.printf(String.format("%%2d | %%%dd\n", n), r, x)
        do {
        	System.out.print("  +");
            for (int i = 0; i < n + 2; i++) {
            	System.out.print("-");
            }
            System.out.println();
            
            if (x%r != 0) {
            	System.out.printf(String.format("%%2d | %%%dd    ... %d", n), r, x/r, x%r); 
            } else {
            	System.out.printf(String.format("       %%%dd    ... %d", n), x/r, x%r);
            }
            d[digits++] = dchar.charAt(x%r); // x를 r로 나눈 나머지를 d에 저장
            x /= r; // x에 x를 r로 나눈 몫 대입
        } while (x != 0);
        return digits;
    }
}

메서드 cardConvR은 정수 x를 r진수로 변환한 값의 각 자리의 문자를 char형 배열 d에 넣어두고 그 자릿수(배열에 넣어둔 문자 수)를 반환하는 메서드입니다. chartAt 메서드는 문자열에서 임의의 문자를 엑세스하기 위한 String 클래스의 메서드입니다.

2) main

public static main(String[] args) {
	Scanner stdIn = new Scanner(System.in);
    int no; // 변환하는 정수
    int cd; // 기수(cardinal)
    int dno; // 변환 후의 자릿수
    int retry; // 다시 한번?
    char[] cno; // 변환 후 각 자리의 숫자를 넣어두는 문자의 배열
    
    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 = cardConvRev(no, cd, cno);
        
        System.out.print(cd + "진수로는 ");
        for (int i = dno-1; i >= 0; i--) {
        	System.out.print(cno[i]);
        }
        System.out.println("입니다.");
        
        System.out.print("한 번 더 할까요? : (1.예/0.아니오)");
        retry = stdIn.nextInt();
    } while (retry == 1); 
}

3) 결과값

기초를 탄탄히!

profile
기초를 탄탄히!

0개의 댓글