#include <stdio.h>
main()
{
long long a;
long long b;
long long c;
a = 10000000000LL; /* 백억 */
b = 15000000000LL; /* 백오십억. */
c = 2 * a + 2 * b;
printf("차떼기 포함 %lld 원\n", c);
}
플렛폼에 따라 틀리지만
기존 문자열-숫자 관련함수에 ll (엘엘) 을 쓰시면 대부분 그대로 먹습니다.
atoll, strtoll, printf("%lld", ...), scanf("%lld", ...) 등등요.
함수 사용시에는 리턴타입이 기본형인 int 형이 아닌 long long 형이므로
꼭 함수원형을 include 시켜주시는게 안전할 것이고요.
지금 확인해 보니까 atoll(), strtoll() 등은 구현이 안된 플랫폼이 있는데,
이 경우에도 printf, scanf 에서는 제대로 먹는 것 같으니까
사용하시는데 큰 무리는 없으실 것으로 보입니다.
BCD
정답인지는 모르겠습니다만... BCD(Binary Coded Decimal)을 이용해서 가능하긴 합니다.
정답인지 모르겠는 이유는 아주 예전에 Z80 어셈블러 이용할때 썼던 방법이기도 하고... 제가 이런 큰 자리수 계산에 대한 지식이나 경험이 없기때문입니다.
팩토리알 계산하는 코드에서도 이런방법을 사용하는걸 본적은 있습니다.
간단하게 설명드리면
문자열자체로 사람이 종이에 써놓고 계산하는 그대로 계산하는 방법입니다.
매우 긴 숫자열이 있다면... 그냥 문자열 그대로... 제일 아랫자리부터 한자리씩 계산하고 올림생기면 올리는.. 방법입니다.
현재 최신 64비트의 longlong 형을 이용하면 왠만한 큰수를 커버할 순 있겠지만... 64비트 CPU를 모두가 쓰는건 아니죠.
간단한 답변
무심코드입니다...
이렇게 하는 방법도 있어요.
long long으로 10억정도야 계산할 수 있죠. 큰 곱셈이 들어가면 다른 방법을 찾아야겠죠.
☆
100000000 진법써서 리스트에 넣으면 되는데요. 1억정도면 long
100000000 진법써서 리스트에 넣으면 되는데요. 1억정도면 long으로 되니깐 1억 단위로 끊어서 list 로 관리하고, 사칙연산은 사람이 하듯이 하면 됩니다.
^^
제 생각에는 10억단위의 "계산" 이기때문에
(계산의 중간값은 10억 단위의 제곱이 될수도 있죠)
확실한 방법은
Long Integer 모듈을 만드는 겁니다.
별거 없구요
void longinteger_add(const char *src1, const char *src2, char *result);
이런식의 함수를 정의해놓고 숫자를 배열에 집어넣고 쓴다면
쉽게 표현할수 있으며 잘 관리하면 Overflow가 일어나지 않습니다.
전 주로 이방법을 씁니다.
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
GNU mp 라이브러리를 이용하세요.http://www.gnu.o
GNU mp 라이브러리를 이용하세요.
http://www.gnu.org/software/gmp/gmp.html
그밖에 이미 만들어져 있는 라이브러리가 많습니다.
long long 형을 쓰면 어떨까요?long long 은 64b
long long 형을 쓰면 어떨까요?
long long 은 64bit 정수를 표현할 수 있는 자료형으로
C99 에서 추가되었고, 대부분의 플랫폼에서 이미 구현되어 있을것입니다.
플렛폼에 따라 틀리지만
기존 문자열-숫자 관련함수에 ll (엘엘) 을 쓰시면 대부분 그대로 먹습니다.
atoll, strtoll, printf("%lld", ...), scanf("%lld", ...) 등등요.
함수 사용시에는 리턴타입이 기본형인 int 형이 아닌 long long 형이므로
꼭 함수원형을 include 시켜주시는게 안전할 것이고요.
지금 확인해 보니까 atoll(), strtoll() 등은 구현이 안된 플랫폼이 있는데,
이 경우에도 printf, scanf 에서는 제대로 먹는 것 같으니까
사용하시는데 큰 무리는 없으실 것으로 보입니다.
댓글 달기