비버놀로지

[JUNGOL 정올] 3116 긴 자리 진법 변환 (C++) 본문

ALGORITM/C C++

[JUNGOL 정올] 3116 긴 자리 진법 변환 (C++)

KUNDUZ 2023. 1. 12. 15:54
728x90

http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2398&sca=5090 

 

JUNGOL

 

www.jungol.co.kr

 

제한시간1000 ms    메모리제한64 MB    해결횟수26 회    시도횟수81 회   

문제

A진법 수 N을 입력 받아 B진법 수로 출력하는 프로그램을 작성하시오.

N에 사용되는 값은 0 ~ 9, A ~ Z이다.

(2 <= A, B <= 36) ( N은 1자리 이상 200자리 이하의 수이다. ) 

 

입력형식

입력은 100개 이하의 테스트 케이스가 행으로 구분하여 주어진다.

테스크 케이스의 끝에는 0이 주어진다. 

각 테스트 케이스에는 세 수 A, N, B가 공백으로 구분되어 주어진다.

 

출력형식

각 테스트 케이스에 대하여 A진법수 N을 B진법 수로 변환한 결과를 행으로 구분하여 출력한다.

 

입력 예

2 10110 10
10 2543 16
16 ABC 8
0

출력 예

22
9EF
5274

 

Hint!

[행단위로 문자열을 입력받기]

 

 

[개행에 관하여]

 

개행(new line)에 관하여

개행(행바꿈)을 하는 경우 윈도우와 리눅스는 차이점이 있습니다. '\r' : carriage return'\n' : line feed[ new line ] = (carriage return) + line feed 윈도우는 옛날 타자기의 타이핑 방법을 그대로 따른 방법으로 '\

comkiwer.tistory.com

 

해당 값을 10진수로 바꾸어 준 후, 변환하고자 하는 숫자로 나누어 나오는 나머지 값을 활용해서 문제를 해결한다.

 

그렇게 나온 값을 역순으로 변경해 주면 원하는 진법의 숫자로 변환이 된다.

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
	int A, B;
	char S[100000];
    
    // A의 값이 0이 들어올 때까지 반복
	while (1) {
		cin >> A;
		if (A == 0) {
			break;
		}
		cin >> S >> B;
		long temp = strtol(S, NULL, A);
		long start = temp;
		string answer = "";
        // 주어진 값이 0이 될때까지 나눠준다.
		while (temp > 0) {
        // 나머지 값이 10이 이상일때는 문자로 표현
			if (temp%B >= 10) {
				char word = 'A' + temp % B - 10;
				answer += word;
			}
			else {
				answer.append(to_string(temp%B));
			}
			temp /= B;
		}
        // 완성된 문자열을 뒤집어 준다.
		reverse(answer.begin(), answer.end());
		if (start == 0) {
			answer = "0";
		}
		cout << answer<<endl;

	}
	return 0;
}

 

728x90
Comments