package algorithm;
import java.util.Scanner;
public class ExponentialConverter_2 {
//x 정숫값, r 진수, d에 아랫자리 부터 넣어두고 자릿수를 반환
static int cardConv(int x, int r, char[] d) {
int digits = 0;
//배열에 0부터 16진수를 위한 문자를 넣어두었다.
String dchar = "0123456789ABCDEFGHIJKLMNOPZRSTUVWXYZ";
//아래 부분이 반복되면, 배열에는 정수를 진수로 나눈 나머지가 들어가서 결론적으로 변환된 값이 배열에 하나씩 들어간다.
do {
//정숫값을 입력된 진수(2~36진수)로 바꾸기 위하여 나눈 값의 나머지를 배열에 저장한다.
d[digits++] = dchar.charAt(x % r);
//x에 진수로 나눈 값을 넣어준다.
x /= r;
} while (x != 0);//x가 0이 아닐때까지만 돌아간다.
for (int i = 0; i < digits / 2; i++) {
char t = d[i];
d[i] = d[digits - i - 1];
d[digits - i - 1] = t;
}
return digits;
}
public static void main(String[] args) {
Scanner scan = 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.println("변환하는 음이 아는 정수:");
no = scan.nextInt();
} while (no < 0);
do {
System.out.println("어떤 진수로 변환할까요?(2~36)");
cd = scan.nextInt();
} while (cd < 2 || cd > 36);
//cd가 2보다 작으면 true -> 반복
//cd가 36보다 크면 true -> 반복
//둘다 틀린다면 false이기 때문에 반복문 탈출
dno = cardConv(no, cd, cno);
System.out.print(cd + "진수로");
for (int i = 0; i < dno; i++) {
System.out.print(cno[i]);
}
System.out.println("입니다.");
System.out.println("한번 더 할까요 ? (1 : 예, 0 : 아니요)");
retry = scan.nextInt();
} while (retry == 1);
System.out.println("지수 변환이 끝났습니다. ");
}
}