출처 | DO IT C언어 자료구조(입문편)
이번 시간에는 기수에 대해 알아보자.
기수란 수를 나타내는 데 기초가 되는 수로, 10진법에서는 0~9까지의 정수를 의미한다.
10진수 정수를 n진수 정수로 변환하려면 정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈을 반복해야 된다.
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
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
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;
}
참고 > ++a / a++의 모든 것.
기수 변환 두 번 째 예제를 살펴보자.
#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);
}
<결과>
다음 시간엔 소수의 나열에 대해 알아보겠다.