문제
[조건] 0 이상의 실수를 입력 받는다. 순환함수를 사용해 2진수로 변환하는 코드를 짜시오.
문제를 풀기 위해, 먼저 이진수 변환하는 방법을 알아보자.
위는 "25.25"라는 10진수를 2진수로 변환하는 방법이다.
소수부 같은 경우, 2를 곱해가는데 색칠한 부분이 1이 넘으면(2이상) 0으로 바꿔주고 계속 계산해준다.
언제까지 계산하느냐? -> 2로 곱한 결과가 1로 딱 나누어떨어졌을 때까지 & 똑같은 소수점이 나올 때까지.!
그리고난 후 색칠한 부분을 차례대로 이어주면 된다.
맞게 계산했는지 알고 싶다면 아래의 사이트에서 확인해보면 된다.
2진수 변환기, 정수및 소수 10진수↔2진수 변환 | OurCalc
10진수를 2진수로 또는 2진수를 10진수로 직접 손으로 변환하려면 번거롭죠. 2진수 변환기를 이용하여 변환하려는 수를 입력하면 자동으로 변환된 값을 확인할 수 있습니다. 소수인 경우도 변환
ourcalc.com
정답코드:
#include <stdio.h>
void int_2bin(unsigned n) //정수 부분 순환함수
{
if (n < 2) printf("%d", n);
else
{
int_2bin(n / 2);
printf("%d", n % 2);
}
}
void dec_2bin(double n) //소수 부분 순환함수
{
static int i = 0;
if (n == 1.0) //종료
{
printf("%d", (int)n);
return;
}
if (n >= 2) n = n - (int)n; //정수부가 1이 넘어가면 정수부를 0으로 세팅
if (i++ > 50) return; //재귀함수 호출 횟수 제한(오버플로우 방지)
if (i > 1) printf("%d", (int)n); //소수점빼고 출력.(정수부분만 출력)
dec_2bin(n * 2);
}
int main()
{
double num = 0.0;
printf(" 음이 아닌 실수 입력: ");
scanf_s("%lf", &num);
printf("\n 2진수로 변환: \n");
int_2bin(num);
printf(".");
num = num - (int)num; //소수부만 빼낸다.
dec_2bin(num);
return 0;
}
정수부와 소수부의 계산법이 다르므로 각각의 다른 함수를 써주었다.
'Back-end > c,c++' 카테고리의 다른 글
캡슐화란? 캡슐화의 장점 - 데이터 추상화, 정보 보호, 정보 은닉 (0) | 2024.01.01 |
---|---|
time()함수와 performance counter (1) | 2023.12.31 |
[C, C++] rand()함수의 난수 생성과 OR연산으로 비트수 확장 (0) | 2023.12.30 |
구조체와 배열의 차이점 (0) | 2023.12.27 |
[C, C++] 최대 담을 수 있는 콩의 개수가 다른 그릇에 콩 공평하게 나누어 주기 문제, 나눗셈 활용 (1) | 2023.12.26 |