13877

#include <stdio.h>
#include <string.h>

#define OCTAL 8
#define DECIMAL 10
#define HEXADECIMAL 16

// 문자열 처음이 0으로 시작되었을 때 
// 0이 아닌 첫 숫자의 인덱스를 반환하는 함수
int start_index(char *num, int len){
    for(int i = 0; i < len; i++){
        if(num[i] != '0'){
            return i;
        }
    }
    return len-1;
}

// 다른 진법을 10진법으로 바꾸는 함수 
int base_to_decimal(char *num, int len, int base){
    int sum = 0;
    int i = start_index(num, len);
    for(i; i < len; i++){
        int j_len = len - 1 - i;
        int multi = 1;
        for(int j = 0; j < j_len; j++){
            multi *= base;
        }
        sum += ((int)num[i]-48) * multi;
    }
    return sum;
}

// 8진수로 해석될 수 있는지 확인하는 함수
int is_octal(char *num, int len){
    int is_octal = 1;
    for(int i = 0; i < len; i++){
        if((num[i]-48) >= OCTAL){
            is_octal = 0;
        }
    }
    return is_octal;
}

int main(void){
    // 테스트 케이스 입력
    int test_case = 0;
    scanf("%d", &test_case);

    for(int i = 1; i <= test_case; i++){
        // 데이터 번호와 문자열(숫자)입력
        int index = 0;
        char num[10000] = {0};
        scanf("%d %s", &index, &num);

        int len = strlen(num);
        // 8진법, 10진법, 16진법 구하기
        int octal = 0;  
        int decimal = base_to_decimal(num, len, DECIMAL);
        int hexadecimal = base_to_decimal(num, len, HEXADECIMAL);
        
        // 8진수로 해석될 수 있으면 8진법으로 구하기
        if(is_octal(num, len)){
            octal = base_to_decimal(num, len, OCTAL);
        }
        

        // 출력
        printf("%d %d %d %d\n", index, octal, decimal, hexadecimal);
    }
}

 

 

+ Recent posts