[자료구조] : 기수 변환 (C)
출처 | DO IT C언어 자료구조(입문편)
이번 시간에는 기수에 대해 알아보자.
-
기수란 수를 나타내는 데 기초가 되는 수로, 10진법에서는 0~9까지의 정수를 의미한다.
-
10진수 정수를 n진수 정수로 변환하려면 정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈을 반복해야 된다.
<기수 변환>
- 19 -> 2진수로 변환하면 (10011) 2진수로 표현된다.
- 59 -> 8진수로 변환하면, (73) 8진수로 표현한다.
- 59 -> 16진수로 변환하면, (3B) 16진수로 표현한다.
10진수
0 1 2 3 4 5 6 7 8 9 10종료의 숫자를 사용해서 수를 나타낸다.
-특징-
1의 자리… : 0부터 9까지 10종류의 수를 나타낸다.
~2의 자리… : 0부터 99까지 100종류의 수를 나타낸다.
~3의 자리 … : 0부터 999까지 1,000종류의 수를 나타낸다.
-특징2-
1234 = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 10^0
8진수
0 1 2 3 4 5 6 7 8종류의 숫자를 사용해서 수를 나타낸다.
-특징-
1의 자리… : 0부터 7까지 8종류의 수를 나타낸다.
~2의 자리… : 0부터 77까지 64종류의 수를 나타낸다.
~3의 자리 … : 0부터 777까지 512종류의 수를 나타낸다.
5306 = 5 * 8^3 + 3 * 8^2 + 0 * 8^1 + 6 * 8^0
16진수
1 2 3 4 5 6 7 8 9 A B C D E F 로 표현한다.
- 0 ~ F는 10진수 0~15까지의 표현이다.
12A0 = 1 * 16^3 + 2 * 16^2 + 10 * 16^1 + 0 * 16^0
16진수와 8진수의 구분은 어떻게 할까?
예를 들어, 28를 두개로 나눠 표현해보겠다.
0x1C (16진수) 0x사용 0x == > 16진수
034 (8진수) 0사용 ==> 8진수
기수를 변환하는 프로그램을 만들어보자.
int digits_change(unsigned x, int n, char d[])
{
char d_char[] = "01234567789ABCDEFGHIJKLNMOPGRSTU";
int digits = 0;
if (x == 0)
{
d[digits++] = d_char[0];
}
else
while (x)
{
d[digits++] = d_char[x % n];
x /= n;
}
return digits;
}
- 이 함수는 정수 x를 n진수로 변환한 갑의 각 자리의 문자를 char형 배열 d에 저장하고 그 자릿수를 반환하는 함수다.
- dchar[0] => 문자 '0' , dchar[1] => 문자'1', 이와같이 정의된다.
- 만약에 x가 59이고 n이 16이면 x % n은 11이다.
- while문은 먼저 x를 n으로 나눈 나머지를 인덱스로 하는, 배열 d_char안에 문자 dchar[x % n]을 배열 d의 요소 d[digits]에 대입하고, digits값을 증가시킨다.
- x를 n으로 나눈다. -> 0이 될때까지 반복한다.
- 그렇게 되면 d[0] = 'B', d[1] = '3'이다. 배열 d에 저장하므로 배열 d의 맨 앞쪽 (d[0])이 가장 마지막 자리가 된다.
참고 > ++a / a++의 모든 것.
- 전위형 증가 연산자 ++a
- ++a를 앞에 놓으면 식 전체를 평가하기 전에 피연산자의 값을 증가시킨다.
- a값이 3일 때, b = ++a를 실행하면 a를 먼저 실행 -> a = 4;
- 그런 다음 ++a를 평가한 값 4를 b에 대입한다. a와 b는 4가 된다.
- 후위형 증가 연산자 a++
- 식 전체를 평가한 후에 피연산자의 값을 증가시킨다.
- a의 값이 3일 때, b = a++를 실행하면, a++평가 값인 3을 b에 먼저 대입
- 다음 ++가 수행되어 a는 4가된다.
기수 변환 두 번 째 예제를 살펴보자.
#include <stdio.h>
int digits_change(unsigned x, int n, char d[])
{
char d_char[] = "0123456789ABCDEFGHIJKLNMOPQRSTUW";
int digits = 0;
if (x == 0)
{
d[digits++] = d_char[0];
}
else
{
while (x)
{
d[digits++] = d_char[x % n];
x /= n;
}
}
return digits;
}
// 기수를 변환하는 함수를 구현 (대화 형식)
int main()
{
int i;
int retry;
unsigned int jungsu; // 양의 정수
int dno; // 변환 후 자리수
int gisu;// 기수
char Champion[512]; // 변환한 값을 담을 배열
// scanf로 사용자로부터 값을 받는다.
puts("10진수를 기수 변환한다.");
do {
printf("변환할 값 양의 정수를 입력하세요 : ");
scanf_s("%u", &jungsu);
do {
printf("양의 정수를 변환할 기수를 입력하세요 : ");
scanf_s("%d", &gisu);
} while (gisu < 2 || gisu > 36);
{
dno = digits_change(jungsu, gisu, Champion);
printf("%d진수로는 ", gisu);
for (i = dno - 1; i >= 0; i--)
{
printf("%c", Champion[i]);
}printf("입니다. \n");
printf("한 번 더 할까요? (1... 예 / 2... 아니요) :");
scanf_s("%d", &retry);
}
} while (retry == 1);
}
<결과>
다음 시간엔 소수의 나열에 대해 알아보겠다.
Author And Source
이 문제에 관하여([자료구조] : 기수 변환 (C)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qlwb7187/자료구조-기수-변환-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)