진법 변환 알고리즘

nnm·2020년 1월 26일
1

10진법

10진법에서 다른 진법으로

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

다른 진법에서 10진법으로

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

2진법

2진법에서 8또는 16진법으로

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또는 16진법에서 2진법으로

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

-2진법

보통의 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());
	}
}

문제

profile
그냥 개발자

0개의 댓글