728x90
반응형
진법
- 진법 변환을 해보자.
- N 이 주어진 경우 B진법이라면 B로 N을 나눈 나머지를 저장해서 거꾸로 출력하면됨
- 이때 10이상인 경우 10은 A로 표현 하여 Z까지 표현 가능함
- 필자는 문자을 출력하는 것을 아스키코드를 이용하여 문제 풀이진행
- 대문자 A의 아스키코드는 65이다.
- 그럼 10이 나오면 +55하면 대문자 아스키코드 65를 만족하게됨 이를 이용해서 풀던지
- 또다른 방법
- 10미만인 경우 값에 +’0’ 을 더하면되고,
- 10이상인 경우 +’A’를 해주면된다.
- 이렇게 되는 것은 문자열 아스키 코드가 49인데 이때 ‘0’이 48이기때문에 그냥 일반 숫자에 이값을 더하게되면 이를 만족하기 때문이다.
- 단, 이때 -10을 해줘야한다는것은 잊지 말아라.
- 이렇게 되는 것은 문자열 아스키 코드가 49인데 이때 ‘0’이 48이기때문에 그냥 일반 숫자에 이값을 더하게되면 이를 만족하기 때문이다.
11005_진법 변환 2
- 문제 링크
- https://www.acmicpc.net/problem/11005
- 소스코드
#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
반응형
'알고리즘 최종 (단계별) > 1.수학' 카테고리의 다른 글
소수 찾기 및 판별_심화 (0) | 2023.07.05 |
---|---|
소수_알고리즘 기본편 (0) | 2023.07.04 |
진법 변환 - 심화 (0) | 2023.06.28 |
진번 기초 문제 (0) | 2023.06.27 |
알고리즘 수학(나머지 연산, 최대 공약수, 최소 공배수) (0) | 2023.06.25 |
댓글