Programming
c/c++ 진법 변환(2, 8, 10, 16)
h34hg0
2022. 5. 1. 12:29
n진수를 10진수로 변환
ABCD = A * n^3 + B * n^2 + C * n^1 + D * n^0
10진수를 n진수로 변환
C언어로 진법 변환 구현
notation.h
//notation.h
char* convertBin(char* number);
char* converterOct(char* number);
int convertDec(char* number);
char* convertHex(char* number);
int isBin(char* number);
int isOct(char* number);
int isDec(char* number);
int isHex(char* number);
int whatNotation(char* number);
notation.c
//notation.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "notation.h"
char* convertBin(char* number) {
char numberSet[] = { '0' ,'1'};
int count = 0, decimal = convertDec(number);
char result[100] = "0b";
for (count; decimal != 0; count++) {
decimal = decimal / 2;
}
decimal = convertDec(number);
for (int i = count + 2; i > 2; i--) {
result[i - 1] = numberSet[decimal % 2];
decimal = decimal / 2;
}
result[count + 2] = '\0';
return result;
}
char* convertOct(char* number) {
char numberSet[] = { '0' ,'1', '2', '3', '4', '5', '6', '7', '8'};
int count = 0, decimal = convertDec(number);
char result[100] = "0o";
for (count; decimal != 0; count++) {
decimal = decimal / 8;
}
decimal = convertDec(number);
for (int i = count + 2; i > 2; i--) {
result[i - 1] = numberSet[decimal % 8];
decimal = decimal / 8;
}
result[count + 2] = '\0';
return result;
}
int convertDec(char* number) {
int notation = whatNotation(number);
if (strlen(number) == 1 && notation == 10) {
return number[0] - '0';
}
int sum = 0;
char memory[100];
char* tmp = tmp = _strlwr(strcpy(memory, number + 2));
if (notation == 10) {
for (int i = 0; i < strlen(number); i++) {
sum += (number[i] - '0') * pow(notation, strlen(number) - 1 - i);
}
return sum;
}
else if (notation == 16) {
for (int i = 0; i < strlen(tmp); i++) {
if ('a' <= tmp[i] && tmp[i] <= 'f') {
sum += (tmp[i] - 'a' + 10) * pow(notation, strlen(tmp) - 1 - i);
}
else {
sum += (tmp[i] - '0') * pow(notation, strlen(tmp) - 1 - i);
}
}
return sum;
}
else if(notation == 2 || notation == 8){
for (int i = 0; i < strlen(tmp); i++) {
sum += (tmp[i] - '0') * pow(notation, strlen(tmp) - 1 - i);
}
return sum;
}
else
return 0;
}
char* convertHex(char* number) {
char numberSet[] = { '0' ,'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
int count = 0, decimal = convertDec(number);
char result[100] = "0x";
for (count; decimal != 0; count++) {
decimal = decimal / 16;
}
decimal = convertDec(number);
for (int i = count + 2; i > 2; i--) {
result[i - 1] = numberSet[decimal % 16];
decimal = decimal / 16;
}
result[count + 2] = '\0';
return result;
}
int isBin(char* number) {
if (strlen(number) == 1)
return 0;
char memory[100];
char* tmp = strcpy(memory, number + 2);
if (!(number[0] == '0' && (number[1] == 'b' || number[1] == 'B'))) {
return 0;
}
for (int i = 0; i < strlen(tmp) - 1; i++) {
if (!('0' <= tmp[i] && tmp[i] <= '1')) {
return 0;
}
}
return 1;
}
int isOct(char* number) {
if (strlen(number) == 1)
return 0;
char memory[100];
char* tmp = strcpy(memory, number + 2);
if (!(number[0] == '0' && (number[1] == 'o' || number[1] == 'O')))
return 0;
for (int i = 0; i < strlen(tmp) - 1; i++) {
if (!('0' <= tmp[i] && tmp[i] <= '7')) {
return 0;
}
}
return 1;
}
int isDec(char* number) {
if (strlen(number) == 1)
if('0' <= number[0] && number[0] <= '9')
return 1;
char memory[100];
for (int i = 0; i < strlen(number); i++) {
if (!('0' <= number[i] && number[i] <= '9')) {
return 0;
}
}
return 1;
}
int isHex(char* number) {
if (strlen(number) == 1)
return 0;
char memory[100];
char* tmp = strcpy(memory, number + 2);
if (!(number[0] == '0' && (number[1] == 'x' || number[1] == 'X')))
return 0;
tmp = _strlwr(tmp);
for (int i = 0; i < strlen(tmp); i++) {
if (!(('0' <= tmp[i] && tmp[i] <= '9') || ('a' <= tmp[i] && tmp[i] <= 'f'))) {
return 0;
}
}
return 1;
}
int whatNotation(char* number) {
if (isBin(number)) {
return 2;
}
else if (isOct(number)) {
return 8;
}
else if (isDec(number)) {
return 10;
}
else if (isHex(number)) {
return 16;
}
return 0;
}
main.c
//main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "notation.h"
void main() {
char number[100];
scanf("%s", number);
printf("Bin : %s\n", convertBin(number));
printf("Oct : %s\n", convertOct(number));
printf("Dec : %d\n", convertDec(number));
printf("Hex : %s", convertHex(number));
}