본문 바로가기

Algorithm/BOJ

[C/perfect C] 프로젝트 Part 1-05 : 십진수를 이진수, 8진수, 16진수로 변환

<문제>

1. 8진수와 16진수를 각각 직접 변환하여 출력하는 모듈을 만들어야하는 부분이 쉽지 않았다.

최대한 다른 모듈을 쓰지 않고 기본연산자만으로 구하려고 했지만 도저히 문제풀이가 떠오르지 않아서 그냥 제곱구하는 pow() 함수만 갖다 쓰기로 했다.

-> 여기서 질문, c언어라서 최대한 저수준으로 짜보려고 해서 다른 라이브러리나 함수를 가져다 쓰지 않고자 한 것인데 이런 식으로 일종의 고집(?!)을 부리는 것이 과연 장기적으로 나의 프로그래밍 실력에 도움이 될까? 다른 언어(python, javascript, java 등)은 다른 라이브러리를 최대한 잘 활용하느냐가 실력의 척도라고 볼 수 있지 않나??

 

(1) 8진수 구하는 모듈

저기저 pow(10, count++)이 제멋대로 값이 나온다 이거 어떻게 해결하냐.. 뭐가 문제냐..

-> pow(arg1, arg2) 의 반환형은 double이고 arg1, arg2 모두 double 형이어야 한다. 그래서 어찌저찌 계산 과정은 실수형으로 하고 결과만 int로 형변환했더니 해결은 됐다. 휴

-> 이것도 그냥 배열에 저장하는게 더 깔끔해서 배열 사용함!

 

(2) 16진수 구하는 모듈

이거는 나머지가 10보다 큰 지 작은지에 따라 문자 또는 숫자로 출력해야하고 나머지 구하는 과정과 16진수로 읽는 과정이 거꾸로라서 출력을 어떻게 해야하는지 너무 고민했다.

그냥 배열에 나머지 계산한 결과를 넣기로 했다...

 

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <math.h>


int main(){
  int inputNum = 1;
  
  while(1){
    printf("정수를 하나 입력하세요. >> ");
    scanf("%d",&inputNum);
    printf("\n\n");

    int temp;
    int octalNum[100], octalIdx=0;
    int hexaNum[100], hexaIdx=0;
    
    // 0. 프로그램 종료 조건 확인
    if(inputNum == 0)
      break;
    
    // 1. 이진수 출력
    printf("\t이진수: ");
    for(int i=31;i>0;i--){
      printf("%c", ((inputNum>>i)&1)?'1':'0');
    }
    printf("0");
    printf("\n\n");

    
    // 2. 팔진수 출력
    printf("\t팔진수: ");
    // 내가 만든 팔진수 모듈을 이용하여 octalNum에 저장
    temp = inputNum;
    while(temp>0){
      octalNum[octalIdx++] = (temp%8);
      temp /= 8;
    }
    // octalNum 출력
    for(int i=octalIdx-1;i>=0;i--){
      printf("%d",octalNum[i]);
    }
    printf("\t%8o",inputNum);
    printf("\n\n");

    
    // 3. 16진수 출력
    printf("\t16진수 : ");
    // 내가 만든 16진수 구하는 모듈을 이용하여 hexaNum에 저장
    temp = inputNum;
    while(temp>0){
      hexaNum[hexaIdx++] = temp%16;
      temp /= 16;
    }
    // hexaNum 문자로 출력
    for(int i=hexaIdx-1;i>=0;i--){
      if(hexaNum[i]<10)
        printf("%d",hexaNum[i]);
      else
        printf("%c",hexaNum[i]+55);
    }
    printf("\t%8X\n\n\n",inputNum);
  }

  printf("종료합니다.\n");
  
  return 0;
}

 

 

 

 

<실행결과>