[자료구조] : 기수 변환 (C)

지환·2022년 2월 13일
0

자료구조

목록 보기
5/38
post-thumbnail

출처 | DO IT C언어 자료구조(입문편)

이번 시간에는 기수에 대해 알아보자.

  1. 기수란 수를 나타내는 데 기초가 되는 수로, 10진법에서는 0~9까지의 정수를 의미한다.

  2. 10진수 정수를 n진수 정수로 변환하려면 정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈을 반복해야 된다.

<기수 변환>

  1. 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;
}
  1. 이 함수는 정수 x를 n진수로 변환한 갑의 각 자리의 문자를 char형 배열 d에 저장하고 그 자릿수를 반환하는 함수다.
  2. dchar[0] => 문자 '0' , dchar[1] => 문자'1', 이와같이 정의된다.
  3. 만약에 x가 59이고 n이 16이면 x % n은 11이다.
    • while문은 먼저 x를 n으로 나눈 나머지를 인덱스로 하는, 배열 d_char안에 문자 dchar[x % n]을 배열 d의 요소 d[digits]에 대입하고, digits값을 증가시킨다.
    • x를 n으로 나눈다. -> 0이 될때까지 반복한다.
  4. 그렇게 되면 d[0] = 'B', d[1] = '3'이다. 배열 d에 저장하므로 배열 d의 맨 앞쪽 (d[0])이 가장 마지막 자리가 된다.

참고 > ++a / a++의 모든 것.

  1. 전위형 증가 연산자 ++a
    • ++a를 앞에 놓으면 식 전체를 평가하기 전에 피연산자의 값을 증가시킨다.
    • a값이 3일 때, b = ++a를 실행하면 a를 먼저 실행 -> a = 4;
    • 그런 다음 ++a를 평가한 값 4를 b에 대입한다. a와 b는 4가 된다.
  2. 후위형 증가 연산자 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);




}

<결과>

다음 시간엔 소수의 나열에 대해 알아보겠다.

profile
아는만큼보인다.

0개의 댓글