old/자료구조_알고리즘

[Java] 기수변환/진수변환 계산기(2진수, 8진수, 10진수, 16진수)

뒷골목프로그래머 2020. 1. 26. 15:52
반응형

본 포스팅은 'Do it! 자료구조와 함께 배우는 알고리즘 입문 Java편'을 스터디 한 내용입니다.

 

기수 : 수를 나타내느데 기초가 되는 수로 10진수에서는 0~9까지의 정수를 말함.

전위형 증가연산자 ++a

  - ++을 앞에 놓으면 식 전체를 평가하기 전 피연산자의 값을 증가시킴

  - 예를들어 a값이 3일 때, b = ++a를 실행하면 ++a평가값 4를 b에 대입시키고 a==b==4가 됨.

 

후위형 증가연산자 a++

   - ++를 뒤에 놓으면 식 전체를 평가한 후에 피연산자의 값을 증가시킴.

   - 예를들어 a값이 3일 때, b = a++을 실행하면 3을 b에 먼저 대입하고 ++이 수행되어,

      a는 4가 됨. 결국 a==4, b==3

 


기수변환(진수변환) 과정을 포함하여 출력하는 계산기 만들기

목차

1. 변환 메소드

2. main 메소드

3. 실행결과

4. 전체코드

 

1. 변환 메소드

    x : 변환될 10진수

    r : 변환할 진수(2~36)

    digitChar : 변환된 진수의 각 자리수에 입력될 값

    chartAt() 메소드 : String 문자열의 index번 째 문자를 찾아가는 메소드

static int cardConvRev(int x, int r, char[] d) {
		
		int digits = 0;
		
		String digitChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		System.out.println(r+"|    "+x);
		System.out.println("  + ------");
		do {
			
			d[digits++] = digitChar.charAt(x % r);
			
			if(x/r !=0) {
				System.out.println(r+"|    "+x/r+" ...."+digitChar.charAt(x % r));
				System.out.println("  + ------");
			}else {
				System.out.println("      "+x/r+" ...."+digitChar.charAt(x % r));
				
			}
			x /= r;		
			
		}while(x != 0);
		
		return digits;
}

 

2. main 메소드

	public static void main(String[] args) {
		
		Scanner stdIn = new Scanner(System.in);
		
		int convertedNum; //변환될 수
		int cardNum; //기수 00진수
		int digitNum; //변환 후 자리수
		int retry; //재시도 여부
		char[] cno = new char[32];
		
		System.out.println("10진수를 기수 변환 합니다.");
		
		do {
			
			do {
				
				System.out.println("변환하는 음이 아닌 정수 : ");
				convertedNum = stdIn.nextInt();
				
			}while(convertedNum<0);
			
			do {
				
				System.out.println("어떤 진수로 변환할까요? (2~36) : ");
				cardNum = stdIn.nextInt();	
								
			}while(cardNum<2 || cardNum > 36);
			
			
			digitNum = cardConvRev(convertedNum, cardNum, cno);
			
			System.out.print(cardNum+"진수로 ");
			for(int i=digitNum-1; i>=0; i--) {
				
				System.out.print(cno[i]);
				
			}
			System.out.println(" 입니다.");
			System.out.println("다시 시도 할까요? (1.예 / 0.아니오) : ");
			retry=stdIn.nextInt();
			
		}while(retry==1);

	}

 

3. 실행결과

 

4. 전체코드

import java.util.Scanner;

/**
 * @Date 2020. 1. 26.
 * @Time 오후 4:03:09
 * @author BRYANT
 * =====================
 * Writing Developer
 */
public class cardConvPractice {
	
	/**
	 * @Author : BRYANT
	 * @Date : 2020. 1. 26.
	 * @Method Name : cardConvRev
	 * @return : int
	 */
	static int cardConvRev(int x, int r, char[] d) {
		
		int digits = 0;
		
		String digitChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		System.out.println(r+"|    "+x);
		System.out.println("  + ------");
		do {
			
			d[digits++] = digitChar.charAt(x % r);
			
			if(x/r !=0) {
				System.out.println(r+"|    "+x/r+" ...."+digitChar.charAt(x % r));
				System.out.println("  + ------");
			}else {
				System.out.println("      "+x/r+" ...."+digitChar.charAt(x % r));
				
			}
			x /= r;		
			
		}while(x != 0);
		
		return digits;
	}

	public static void main(String[] args) {
		
		Scanner stdIn = new Scanner(System.in);
		
		int convertedNum; //변환될 수
		int cardNum; //기수 00진수
		int digitNum; //변환 후 자리수
		int retry; //재시도 여부
		char[] cno = new char[32];
		
		System.out.println("10진수를 기수 변환 합니다.");
		
		do {
			
			do {
				
				System.out.println("변환하는 음이 아닌 정수 : ");
				convertedNum = stdIn.nextInt();
				
			}while(convertedNum<0);
			
			do {
				
				System.out.println("어떤 진수로 변환할까요? (2~36) : ");
				cardNum = stdIn.nextInt();	
								
			}while(cardNum<2 || cardNum > 36);
			
			
			digitNum = cardConvRev(convertedNum, cardNum, cno);
			
			System.out.print(cardNum+"진수로 ");
			for(int i=digitNum-1; i>=0; i--) {
				
				System.out.print(cno[i]);
				
			}
			System.out.println(" 입니다.");
			System.out.println("다시 시도 할까요? (1.예 / 0.아니오) : ");
			retry=stdIn.nextInt();
			
		}while(retry==1);

	}

}
반응형