재귀 함수를 통한 진법 변환 코드를 만들어봤어요.
// 10진수로 바꿔주는 함수
int change_to_decimal(char arr[], int base)
// 진법을 변환시켜주는 재귀함수
void base_conversion(int num, int base)
두 함수만 눈 여겨 보시면 될거같아요.
코드:
#include <stdio.h>
int main()
{
void base_conversion(int num, int base);
int change_to_decimal(char arr[], int base);
int check_base(int base);
// base: 입력 숫자의 진법, target: 변환할 진법
int base, target;
int result_change_deciaml;
// 변환할 숫자
char arr[100];
printf("변환할 숫자: ");
scanf("%s", arr);
printf("입력한 숫자의 진법 (2, 4, 8, 10, 16, 32) : ");
scanf("%d", &base);
if(!check_base(base)){
printf("%d: 허용되지 않는 진법입니다.\n", base);
return 0;
}
printf("바꿀 진법 (2, 4, 8, 10, 16, 32): ");
scanf("%d", &target);
if(!check_base(target)){
printf("%d: 허용되지 않는 진법입니다.\n", target);
return 0;
}
// 배열 개수 (반복문 돌기위해)
int len = sizeof(arr) / sizeof(arr[0]);
// 입력 받은 수 10진법 변환
result_change_deciaml = change_to_decimal(arr, base);
if(result_change_deciaml < 0){
return 0;
}
// base_conversion (변환할 숫자, 진법)
base_conversion(result_change_deciaml, target);
printf("\n");
return 0;
}
void print_num(int num){
if(num < 10){
printf("%d", num);
return;
}
char c = (char)(num + 55);
printf("%c", c);
}
// 재귀 함수를 통한 진법 변환 (num 은 항상 10진수의 수)
void base_conversion(int num, int target){
if(num < target){
print_num(num);
return;
}
base_conversion(num / target, target);
print_num(num % target);
}
int change_to_decimal(char arr[], int base){
int getsize(char arr[]);
// getsize() 문자열의 길이를 받아오는데 공백 자리는 빠진다.
int len = getsize(arr);
int sum = 0;
int k = 0;
int m;
int j;
//printf("%d\n", len);
// 제일 뒤에서 부터
// 1010
// <-
for(int i = (len - 1); i >= 0; i--){
k = (int)arr[i];
//printf("k::: %d(%c)\n", k, arr[i]);
// 아스키코드 48 ~ 57 => 0 ~ 9
if(k > 47 && k < 58){
k -= 48;
}else if(k > 96 && k < 123){
// 소문자 체크
k -= 87;
}else if (k > 64 && k < 91){
k -= 55;
}else {
printf("%c: 허용되지 않는 입력값입니다.\n", arr[i]);
return -1;
}
if(k == 0){
continue;
}
// 제일 첫 번째 배열이면 무조건 x1
if(i == len - 1){
m = 1;
}else{
j = len - 2;
m = base;
while(j > i){
m *= base;
j--;
}
}
k *= m;
//printf("k: %d, m: %d\n", k, m);
sum += k;
}
//printf("sum: %d\n", sum);
return sum;
}
int getsize(char arr[]){
int i = 0;
while(1){
if(arr[i] == '\0'){
break;
}
i++;
}
return i;
}
int check_base(int base){
if(base == 2 || base == 4 || base == 8
|| base == 10 || base == 16 || base == 32){
return 1;
}
return 0;
}
결과:
변환할 숫자: 255
입력한 숫자의 진법 (2, 4, 8, 10, 16, 32) : 10
바꿀 진법 (2, 4, 8, 10, 16, 32): 16
FF
변환할 숫자: 10010011
입력한 숫자의 진법 (2, 4, 8, 10, 16, 32) : 2
바꿀 진법 (2, 4, 8, 10, 16, 32): 10
147