2011/06/27 - [프로젝트/큰수 클래스(Big Numerics)] - [BigInteger - 1] 큰수를 저장하는 법

이전 글에서 큰수를 저장하는 방식에 대해 글을 썼습니다.
그 글을 바탕으로 BigInteger 클래스를 만들어 보겠습니다. ^^

이 클래스는 분할 컴파일을 할겁니다.
저는 BigIntger.h, BigInteger.cpp 두 파일을 만들어서
클래스 선언과 템플릿 함수 정의는 헤더 파일에, 나머지 함수들은 .cpp 파일에 넣도록 하겠습니다.

음.. 설명을 아주 세세한 부분까지는 하지 않겠습니다.
세세하게 하자면 한도끝도없기 때문에 적당한 선에서 자세히 설명하도록 노력하겠습니다.

 
#pragma region 변수선언
public:
	typedef unsigned long length; // 길이
	typedef unsigned long index; // blk의 배열값 접근용
	typedef unsigned long blocktype; // blk의 배열 타입
	typedef enum {Positive = 1, Zero = 0, Negative = -1} Sign; // 부호
private:
	typedef enum {Greater = 1, Equal = 0, Less = -1} CmpResult; // BigInteger의 크기 비교용
	length len; // BigInteger의 배열 길이를 나타냅니다.
	blocktype *blk; // 실질적인 숫자를 저장하는 공간입니다.
	Sign sign; // 숫자의 부호를 나타냅니다. (양수 : 1, 음수 : -1, 영 : 0)
#pragma endregion


클래스 내에서 사용할 변수들입니다.
BigInteger형은 3개의 변수를 가집니다.
우선 얼마만큼의 길이를 가지는지를 저장할 len, unsigned long형으로 선언하였습니다.
실제로 숫자가 저장되는 blk,  이것도 unsigned long형이며, 동적 배열로 크기를 결정합니다.
끝으로 숫자의 부호를 나타내는 sign, enum형이며 양수, 음수, 영을 표현합니다.

소스의 가독성을 높이기 위해 4개의 사용자 정의형을 사용하였습니다.
length은 비트길이, 블록길이등.. 길이에 관련된 값을 받거나 리턴할 때, 사용할 것이며
index는 blk의 배열값들에 접근하기 위해 사용합니다.
index a = 3;
blk[a]; 
a가 index형이므로 blk의 배열값을 읽는데 사용될것이란걸 알기 때문에 좀더 가독성이 좋아질거라 생각합니다.
blocktype은 blk의 타입을 지정합니다. 이 또한 blk에 관한 값을 받거나 리턴할 때, 사용되어 질겁니다.

Sign은 public으로 선언하였으며, BigInteger형의 부호를 나타냅니다.
실전에서는 다음과 같이 효율적으로 사용할 수 있습니다.

for(BigInteger a = 10; a != 0; --a) // a와 0을 비교해야 하므로 비효율적
for(BigInteger a = 10; a.getsign() != BigInteger::Zero; --a) // a의 부호만 비교하면 되므로 보다 효율적
Posted by 투명테잎