티스토리 뷰

X진수로 표현된 수 number를 Y진수로 표현하기.

옛날에 학교에서는 큰 수의 연산을 진행하기 위한 NaryBigNum을 한 적 있었는데 그 때는 10진수로 변환해서 계산하면 overflow되는 상황이 많았다. 근데 뭐 진수 변환하는데는 10진수를 중간 임시 변수로 써도 되지 않을까.. 10진수로 한 번 변환하면 int와 관련된 연산들을 다 쓸 수 있어서 많이 편하고 일반성도 있으니까..

그래서 알고리즘은 이렇게 짰다.

1. X진수로표현된 수를 10진수로 표현(temp)

2. temp가 Y진수로 몇 자리 수인지 파악(N)

3. Y진수로 표현

 

그 과정에서 char->int, int->char연산을 쉽게 하기 위해 따로 함수 2개를 작성했다.

#include<iostream>
using namespace std;
//'A':65 '0':48 in ASCII
int ASCIIDecode(char X) {
	return (X >= 65) ? int(X - 55) : int(X-48);
}
char ASCIIEncode(int X) {
	return (X >= 10) ? char(X + 55) : char(X +48);
}

//number는 X진법의 수, 그것을 Y진법으로 Print하라
//2<=X,Y<=36;
void PrintXtoY(string number, int X, int Y) {
	int temp = 0, N = 0, Q = 0;
	for (int i = 0; i < number.length(); i++) temp += ASCIIDecode(number[number.length() - 1 - i]) * pow(X, i);
	for (int temp2 = temp; temp2 != 0; N++) temp2 = temp2 / Y;
	for (int i = N-1; i >= 0; i--) {;
		cout << ASCIIEncode(Q = int(temp / (pow(Y, i))));
		temp = temp - Q * pow(Y, i);
	}
}


int main() {
	string A = "FF";
	PrintXtoY(A, 16, 10);
	cout << endl;
	string B = "99";
	PrintXtoY(B, 10, 16);
	cout << endl;
	string C = "11101";	//2진수: 십진수로 29
	PrintXtoY(C, 2, 16);
	cout << endl;
}

 

for문 3개로 했는데 더 간단하게 될 수도? N을 굳이 구해야 하나 싶기는 하다

 

 

댓글