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);
}
}