zz12345의 코딩 공부

 

https://www.acmicpc.net/problem/11576

 

11576번: Base Conversion

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의

www.acmicpc.net

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
using namespace std;
 
int main() {
    vector<int> arr;
    int a,b;
    int n,t;
    int sum=0;
    int k=1;
    cin>>a>>b;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>t;
        arr.push_back(t);
    }
    for(int i=n-1;i>=0;i--)
    {
        sum=sum+arr[i]*k;
        k=k*a;
    } 
    arr.clear();
    while(sum!=0)
    {
        arr.push_back(sum%b);
        sum=sum/b;
    }
    for(int i=arr.size()-1;i>=0;i--)
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}
cs

풀이

 입력의 첫째 줄에 변환하기 전 주어지는 수의 진법 a와 변환할 진법 b가 주어지고 둘째 줄에 변환될 수의 자릿수의 개수 (코드의 n ), 셋째 줄에는 a 진법으로 표현된 n 자리의 수를 준다. 셋째 줄의 수를 진법 b로 변환하여 출력하는 문제이다.

 주어진 진법 a의 수를 10진법의 수로 변환하고 그 수를 다시 진법 b로 변환하는 방법을 사용했다. 어떤 수와 진법 a가 주어졌을 때 그 수를 10진법으로 변환하려면 어떤 수의 가장 우측 자릿수부터 각 자리마다 해당하는 진법 a^0, a^1, a^2……을 곱하여 더해주면 된다.
예제 입력1과 같이 진법 a가 17이고 변환할 수가 2 16인 경우에는 (2 * 17^1) + (16 * 17^0) 를 수행해주면 된다. 이를 수행하기 위하여 13~17행에 변환할 어떤 수를 벡터로 입력받고 18~22행에 어떤 수의 마지막 자리부터 진법 a에 해당하는 수를 제곱한값을 곱하면서 더하여 값을 구해준다.

22행이 완료된다면 변수 sum에 진법 a로 표현된 수가 10진법으로 변환된 값이 저장된다. sum을 진법 b로 나눈 나머지를 계속 저장하면서 sum을 b로 나눠서 sum이 0이 아닐 때까지 수행한 뒤 sum을 b로 나눈 나머지 값을 뒤에서부터 출력해 주면 10진법으로 표현된 sum 값을 진법 b로 나타낸 것이 된다.

공유하기

facebook twitter kakaoTalk kakaostory naver band