알고리즘 진법 - 1 (기초)
본문 바로가기
알고리즘 최종 (단계별)/1.수학

알고리즘 진법 - 1 (기초)

by KyeongMin 2023. 6. 26.
728x90
반응형

진법

  • 진법 변환을 해보자.
  • N 이 주어진 경우 B진법이라면 B로 N을 나눈 나머지를 저장해서 거꾸로 출력하면됨
  • 이때 10이상인 경우 10은 A로 표현 하여 Z까지 표현 가능함
  • 필자는 문자을 출력하는 것을 아스키코드를 이용하여 문제 풀이진행
    • 대문자 A의 아스키코드는 65이다.
    • 그럼 10이 나오면 +55하면 대문자 아스키코드 65를 만족하게됨 이를 이용해서 풀던지
    • 또다른 방법
      • 10미만인 경우 값에 +’0’ 을 더하면되고,
      • 10이상인 경우 +’A’를 해주면된다.
        • 이렇게 되는 것은 문자열 아스키 코드가 49인데 이때 ‘0’이 48이기때문에 그냥 일반 숫자에 이값을 더하게되면 이를 만족하기 때문이다.
          • 단, 이때 -10을 해줘야한다는것은 잊지 말아라.

11005_진법 변환 2

#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;

int main(void) {
	//char a = 10+55;
	//cout << a << endl;
	int N, B;
	cin >> N >> B;
	vector<char>result;
	while (1) {
		char nModB = N % B;
		result.push_back(nModB);
		N = N / B;
		if (N == 0)break;
	}

	for (int i = result.size() - 1; i >= 0; i--) {
		if (result[i] >= 10) printf("%c", result[i] + 55);
		else printf("%d", result[i]);
	}
	return 0;
}
  • 위의 소스는 필자가 해결한 첫 번째 방법이다.
  • 두번째 ‘0’, ‘A’를 더하는 경우
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

int main(void) {
	int n, b;
	cin >> n >> b;
	string ans = "";
	while (n > 0) {
		int r = n % b;
		if (r < 10) ans += (char)(r + '0');
		else  ans += (char)(r-10 + 'A');
		n /= b;
	}
	reverse(ans.begin(), ans.end());
	cout << ans << '\\n';

	return 0;
}

진법 변환

  • B 진법을 다시 10진법으로 바꾸자.

2745_진법 변환

11 3

11/3 2
3/3 0
1

1 * 3 + 0 = 3
3 * 3 + 2 = 11

---
14 3

14/3 = 2
4/3 = 1
1

1 * 3= 3
3 * 3 + 1

1 * 3 + 1 = 4
4 * 3 + 2 = 14
  • 처음 숫자와 B를 곱하고 다음 값을 더한다.
  • 그리고 이를 반복한다.
  • 소스코드 구현
#include<iostream>
#include<string>
using namespace std;

int main(void) {
	string N;
	int B;
	cin >> N >> B;

	int ret = 0;

	for (int i = 0; i < N.size(); i++) {
		if (N[i] >= 'A') ret = ret * B + (N[i] - 'A' + 10);
		else ret = ret * B + (N[i] - '0');
	}
	cout << ret << '\\n';
	return 0;
}
728x90
반응형

댓글