10진법의 수 N을 B진법으로 변환하고자 할 때, N을 B로 더 이상 나눌 수 없을 때 까지 나누며 나눌 때 마다 나머지를 기록한다. 기록한 나머지를 거꾸로 출력한다.
public class B11005_진법변환2 {
// A = 65
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
long N = sc.nextLong();
int B = sc.nextInt();
if(N == 0) {
System.out.println(0);
return;
}
while(N != 0) {
long remainder = N % B;
if(remainder > 9) {
sb.insert(0, (char)(remainder + 55));
} else {
sb.insert(0, remainder);
}
N /= B;
}
System.out.println(sb.toString());
}
}
B진법의 수 N을 10진법으로 변환하고자 할 때, 각 자리 수에 B^(자리수 - 1)
을 곱하여 모두 더한다.
public class B2745_진법변환 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String N = sc.next();
int B = sc.nextInt();
long ans = 0;
int power = N.length() - 1;
for(int i = 0 ; i < N.length() ; ++i) {
char num = N.charAt(i);
if(num >= 'A' && num <= 'Z') {
ans += (num - 55) * Math.pow(B, power--);
} else {
ans += (num - '0') * Math.pow(B, power--);
}
}
System.out.println(ans);
}
}
8진법은 3자리 16진법은 4자리씩 뒤에서부터 끊어서 각 자리 수에 2^(자리수 - 1)
을 곱하고 다시 이어붙인다.
public class B1373_2진수8진수 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
String bin = sc.next();
int temp = 0;
int remain = bin.length() % 3;
if(remain == 1) {
sb.append(bin.charAt(0) - '0');
} else if(remain == 2) {
temp += (bin.charAt(0) - '0') * 2;
temp += bin.charAt(1) - '0';
sb.append(temp);
}
for(int i = remain ; i < bin.length() ; i += 3) {
temp = 0;
temp += (bin.charAt(i) - '0') * 4;
temp += (bin.charAt(i + 1) - '0') * 2;
temp += bin.charAt(i + 2) - '0';
sb.append(temp);
}
System.out.println(sb.toString());
}
}
8진법(8가지) 또는 16진법(16가지)에서 2진법으로 변환한 배열을 만든다. 현재 진법의 자리 수 마다 2진법으로 바꾸어 이어붙인다. 제일 앞쪽의 0을 제거한다.
public class B1212_8진수2진수 {
static String[] octToBin = {"000", "001", "010", "011", "100", "101", "110", "111"};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
char[] oct = sc.next().toCharArray();
// 주어진 8진수가 0일 경우
if(oct.length == 1 && oct[0] == '0') {
System.out.println(0);
return;
}
// 주어진 8진수의 각 수를 2진수로 바꾼다.
for(int i = 0 ; i < oct.length ; ++i) {
sb.append(octToBin[oct[i] - '0']);
}
// 변환된 2진수의 가장 앞에 오는 0을 없앤다.
while(sb.charAt(0) == '0') {
sb.deleteCharAt(0);
}
System.out.println(sb.toString());
}
}
보통의 10진법에서 2진법으로 변환하는 방법을 따르지만 나눈 몫을 올림하여 처리한다.
public class B2089_음의2진수 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
long n = sc.nextLong();
// 0일때는 바로 0 출력
if(n == 0) {
System.out.println(0);
return;
}
// 10진수 -> 2진수와 같이 10진수를 계속해서 2로 나누고 나머지를 거꾸로 출력한다.
// 하지만, -2진수에서는 나눈 몫을 올림한다.
while(n != 0) {
sb.insert(0, Math.abs(n%-2));
n = (long) Math.ceil((double)n / -2);
}
System.out.println(sb.toString());
}
}