정숫값을 기수로 변환하는 알고리즘을 살펴보자.
기수 = 수를 나타내는 데 기초가 되는 수로 10진수, 2진수, 8진수, 16진수가 있다.
10진수
10진수는 아래 10종류의 숫자를 사용해 수를 나타낸다.
0 1 2 3 4 5 6 7 8 9
10진수의 각 자리는 아랫자리부터 100,10¹, 10², ...으로 10의 거듭제곱 값을 갖는다.
1234 = 1 x 10³ + 2 x 10² + 3 x 10¹ + 4 x 100
와 같이 풀어쓸 수 있다.
8진수
8진수는 아래 9종류의 숫자를 사용하여 수를 나타낸다.
0 1 2 3 4 5 6 7
8진수의 각 자리는 아랫자리부터 80, 8¹, 8², ...으로 8의 거듭제곱 값을 갖는다.
5306 = 5 x 8³ + 3 x 8² + 0 x 8¹ + 0 x 80
와 같이 풀어쓸 수 있다.
16진수
16진수는 아래 16종류의 문자를 사용하여 수를 나타낸다.
0 1 2 3 4 5 6 7 8 9 A B C D E F
0~F는 10진수 10~15에 해당한다.
16진수 또한 아랫자리부터 순서대로 160, 16¹, 16² ... 으로 16의 거듭제곱 값을 갖는다.
12A0 = 1 x 16³ + 2 x 16² + 10 x 16¹ + 0 x 160
처럼 풀어쓸 수 있다.
기수 변환을 수행하는 프로그램 살펴보기
import java.util.Scanner;
class CardConvRev {
static int cardConvR(int x, int r, char[] d) {
//정숫값 x를 r진수로 변환하여 배열 d에 아랫자리부터 넣어두고 자릿수를 반환
int digits = 0;
String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
do{
d[digits++] = dchar.charAr(x % r); // r로 나눈 나머지 저장
x /= r;
} while (x != 0);
return digits;
}
문자열 dchar는 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"로 초기화되어 있으므로 각 문자는 아래와 같이 접근할 수 있다.
메서드 맨 앞에서 0으로 초기화하는 digits는 변환한 수의 자릿수를 나타내기 위한 변수이다.
do문 루프 본문에서 수행되는 작업
1 x를 r로 나눈 나머지를 인덱스로 하는 문자를 배열 d의 요소 d[digits]에 대입하고 digits 값을 증가시킨다.
2 x를 r로 나눈다.
예시
나머지를 구하는 순서대로 배열 d에 저장하므로 배열의 맨 앞인 d[0]이 가장 마지막 자리가 된다.
따라서 위 예시의 답은 0x3B가 된다.
'알고리즘 > 자료구조와 알고리즘' 카테고리의 다른 글
[Algorithm] 중복된 문자 제거하기 for JAVA (0) | 2021.11.05 |
---|---|
[Algorithm] 탐욕(그리디) 알고리즘 (greedy algorithm) (0) | 2021.09.30 |
[Algorithm] 이진 검색 알고리즘 (0) | 2021.09.13 |
[Algorithm][Java] 소수를 나열하는 알고리즘, 소수인지 판단하기 (0) | 2021.08.23 |
[Algorithm][Java] 배열 안 요소를 역순으로 정렬하기 (0) | 2021.08.17 |