Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다.

 

10진수를 n진수로 변환하는 방법을 모른다면 아래의 포스팅에서[10진수-n진수 변환] 부분을 읽고 오시는 것을 추천합니다.

2022.11.29 - [Math/이산수학] - 진수, 진법 변환, 보수

 

진수, 진법 변환, 보수

[진수] [10진수] 기수가 10인 수 0, 1, 2 ,3, 4, 5, 6 ,7, 8, 9 -> 10개 수로 표현 [2진수] 기수가 2인 수 0, 1 두개의 수로 표현 [8진수와 16진수] [8진수] 0~7까지 8개의 수로 표현 2진수 3자리는 8진수 1자리 2진수

rebugs.tistory.com


10진수를 2~36진수로 변환하는 알고리즘

static void cardConvR(int x, int r)
{
    char []d = new char[32];
    int digits = 0; //변환된 진수의 자릿수를 저장
    String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    do {
        d[digits++] = dchar.charAt(x % r); // r로 나눈 나머지를 저장
        x /= r;
    } while (x != 0);
    for(int i = digits-1; i>=0; i--) System.out.print(d[i]);
}
설명
위와 같은 결과로 이루어진 배열을 역순으로 출력하면
진수변환이 되는 것이다.
문자 추출 charAt() 메소드
charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다.
dchar.charAt(x % r)에서 x는 59 r이 16이라고 가정하면 59를 16로 나눈 후 나머지는 11이다
dchar배열의 인덱스 11은 B이므로 B가 리턴된다.

 

실행 예제

import java.util.Scanner;
public class Main{
	static void cardConvR(int x, int r)
	{
	    char []d = new char[32];
	    int digits = 0; //변환된 진수의 자릿수를 저장
	    String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	    do {
	        d[digits++] = dchar.charAt(x % r); // r로 나눈 나머지를 저장
	        x /= r;
	    } while (x != 0);
	    for(int i = digits-1; i>=0; i--) System.out.print(d[i]);
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("변환할 정수 입력 : ");
		int num = sc.nextInt();
		System.out.print("진수 입력 : ");
		int n = sc.nextInt();
		cardConvR(num,n);
	}
}
/*
변환할 정수 입력 : 59
진수 입력 : 2
111011
*/

 

 

자세한 계산과정을 출력하는 알고리즘

static void cardConvR(int x, int r)
{
    char []d = new char[32];
    int digits = 0; //변환된 진수의 자릿수를 저장
    String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    System.out.printf("%2d | %6d\n",r,x);
    System.out.println("   + -------");
    do {
        d[digits++] = dchar.charAt(x % r); // r로 나눈 나머지를 저장
        if((x/r) == 0) System.out.printf("     %6d ... %2c\n", x/r, dchar.charAt(x % r));
        else System.out.printf("%2d | %6d ... %2c\n", r, x/r, dchar.charAt(x % r));
        x /= r;
        if(x != 0) System.out.println("   + -------");

    } while (x != 0);
    System.out.print("변환된 값 : ");
    for(int i = digits-1; i>=0; i--) System.out.print(d[i]);
}

 

실행예제

import java.util.Scanner;
public class Main{
	 static void cardConvR(int x, int r)
    {
        char []d = new char[32];
        int digits = 0; //변환된 진수의 자릿수를 저장
        String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        System.out.printf("%2d | %6d\n",r,x);
        System.out.println("   + -------");
        do {
            d[digits++] = dchar.charAt(x % r); // r로 나눈 나머지를 저장
            if((x/r) == 0) System.out.printf("     %6d ... %2c\n", x/r, dchar.charAt(x % r));
            else System.out.printf("%2d | %6d ... %2c\n", r, x/r, dchar.charAt(x % r));
            x /= r;
            if(x != 0) System.out.println("   + -------");

        } while (x != 0);
        System.out.print("변환된 값 : ");
        for(int i = digits-1; i>=0; i--) System.out.print(d[i]);
    }
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("변환할 정수 입력 : ");
		int num = sc.nextInt();
		System.out.print("진수 입력 : ");
		int n = sc.nextInt();
		cardConvR(num,n);
	}
}
/*
변환할 정수 입력 : 59
진수 입력 : 8
 8 |     59
   + -------
 8 |      7 ...  3
   + -------
          0 ...  7
변환된 값 : 73
*/