함수로 빼거나 하지 않는 순수한 초보의 코딩력이다.
2진법을 10진법으로 바꾸는 것은 생각보다 어려운 것이였다.
1. 이진법을 미리 입력하는 것이 아닌 직접 입력하기
2. 이진법을 십진법으로 바꾼 계산한 계산식이 표현될 것
3. 결과물에는 안나오지만 위치에 따른 첨자(자리 번호)를 이용해 계산
이 목표이고
subscript -> 첨자( 5자리 숫자면 [5][4][3][2][1]로 자릿 수를 표현 )
exponent -> 지수( 2^3 = 8 일 때 3을 나타냄, 0011 이면 2^1 + 2^0 으로 1,0이 지수임)
binaryCount -> 이진수에서 1을 검출하여
0001 -> 1 // 1이 2개 이상부터 '+' 기호가 추가됨
0101 -> 2^2 + 1 // 지수가 0 일 땐 2^0 이 아닌 1로 표현
0110 -> 2^2 + 2^1
이런식으로 표현 가능하다.

포인터를 이용하여 문자포인터 -> 숫자(정수)포인터에 넣어 출력
숫자 포인터는 중간에 pow 함수를 이용한 계산 때문에 double을 써야하지만 결국엔 int형으로 바꿔야 해서 생략

flag와 count를 이용하여 특정 문자(0, 1)가 아니면 넘어가지 않도록 함

문자를 %d 나 int 로 표시하면 아스키 코드 값이 나오기 때문에 -48을 사용하는 수작업이 필요

pow 함수를 쓰면 2^0 이든 0^0 이든 1 로 나타내기 0일때 결과값에서 -1 해줘야함
pow 함수 사용 부분은 사실
binaryToDecimal[subscript] = ((int)binary[i] - 48) * pow(2.0, exponent);
라고 하면 바로 위 캡쳐의 코드가 필요 없다.

아래는 전체 코드이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h> // strlen
#include <stdlib.h> // malloc, free
#include <math.h> // pow
int main(){
char* binary;
binary = malloc(sizeof(char)*1024);
int* binaryToDecimal;
binaryToDecimal = malloc(sizeof(int)*1024);
int flag = 0; //while 문 지속
int count = 0; //0,1만으로 이뤄졌는지 확인용 횟수
int subscript; //첨자
double exponent; //지수
int binaryCount = 0;
int decimal = 0;
printf("---------------------------\n");
do{
printf("이진수를 입력하세요 : ");
count = 0;
scanf("%s", binary); // 입력
int length = strlen(binary); // 입력된 포인터 문자열의 길이
for (int i = 0; i < length; i++)
{
if (binary[i] != '0' && binary[i] != '1') //0,1 아니면 처음부터 다시 입력
{
flag = 1;
break;
}
count++; //확인된 문자열 길이만큼 +1
}
if(length == count) // 입력받은 문자열 길이랑 확인 횟수 같으면 다음으로 진행
{
flag = 0;
}
}while(flag);
printf("---------------------------\n");
for (int i = 0; i < count; i++)
{
subscript = count - i; // 첨자 자리
exponent = subscript - 1; // 첨자 위치에 따른 지수 계산
binaryToDecimal[subscript] = pow(2.0*((int)binary[i] - 48), exponent); // 거듭제곱 계산
decimal += binaryToDecimal[subscript]; // 거듭제곱 합
if(binary[i] == '1') // 이진법의 1의 갯수
binaryCount++;
if(binary[i] - 48 != 0) //이진수 표현식에서 1 찾아냄
{
if (binaryCount > 1) // 1이 2개 이상부터 + 추가
printf("+ ");
if(exponent != 0) // 마지막 자리 이외에 나머지는 지수형 : 2^()로 표현
printf("2^%.0f ", exponent);
else // 마지막 자리는 2^0 = 1
printf("1");
// printf("2^%.0f", exponent); 2^0 표현
}
}
if ((int)binary[count-1]-48 == 0) //0의 0 제곱은 1이라서 1110 <- 맨 끝자리가 0이면 -1 해주기
{
decimal -= 1;
}
printf(" = %d\n", decimal);
printf("--------------------------\n");
printf("십진수 결과 값 : %d\n", decimal);
free(binary); //동적 할당 해제
free(binaryToDecimal); //동적 할당 해제
return 0;
}
'C' 카테고리의 다른 글
| C언어 이분검색(binarySearch) (0) | 2021.04.18 |
|---|