10억단위 숫자를 계산해야 하는데...

kernelbomb의 이미지

문자열로 "1442674400" 이란것이 있습니다. 이것을 숫자로 바꾸어

계산을 해야 하는데요. 어떤 자료형을 써야 할지 모르겠네요.

long, double로 해봤지만, 한계가 있는것 같고...

또다른 자료형이 존재하는지요? 도와주세요~~

simpid의 이미지

정답인지는 모르겠습니다만... BCD(Binary Coded Decimal)을 이용해서 가능하긴 합니다.

정답인지 모르겠는 이유는 아주 예전에 Z80 어셈블러 이용할때 썼던 방법이기도 하고... 제가 이런 큰 자리수 계산에 대한 지식이나 경험이 없기때문입니다.
팩토리알 계산하는 코드에서도 이런방법을 사용하는걸 본적은 있습니다.

간단하게 설명드리면
문자열자체로 사람이 종이에 써놓고 계산하는 그대로 계산하는 방법입니다.

매우 긴 숫자열이 있다면... 그냥 문자열 그대로... 제일 아랫자리부터 한자리씩 계산하고 올림생기면 올리는.. 방법입니다.

현재 최신 64비트의 longlong 형을 이용하면 왠만한 큰수를 커버할 순 있겠지만... 64비트 CPU를 모두가 쓰는건 아니죠.

qufdl113의 이미지

무심코드입니다...

{
char str_num[32]={0,}
long long ll_num=0;

strcpy(str_num,"1442674400"); 
sscanf(str_num,"%lld",&ll_num); //문자열 숫자로 바꾸기.

printf("%lld\n",ll_num);
} 

이렇게 하는 방법도 있어요.
long long으로 10억정도야 계산할 수 있죠. 큰 곱셈이 들어가면 다른 방법을 찾아야겠죠.

markboy의 이미지

100000000 진법써서 리스트에 넣으면 되는데요. 1억정도면 long으로 되니깐 1억 단위로 끊어서 list 로 관리하고, 사칙연산은 사람이 하듯이 하면 됩니다.

sozu의 이미지

제 생각에는 10억단위의 "계산" 이기때문에
(계산의 중간값은 10억 단위의 제곱이 될수도 있죠)

확실한 방법은

Long Integer 모듈을 만드는 겁니다.

별거 없구요

void longinteger_add(const char *src1, const char *src2, char *result);

이런식의 함수를 정의해놓고 숫자를 배열에 집어넣고 쓴다면

쉽게 표현할수 있으며 잘 관리하면 Overflow가 일어나지 않습니다.

전 주로 이방법을 씁니다.

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

cdpark의 이미지

GNU mp 라이브러리를 이용하세요.

http://www.gnu.org/software/gmp/gmp.html

그밖에 이미 만들어져 있는 라이브러리가 많습니다.

최종호의 이미지

long long 형을 쓰면 어떨까요?

long long 은 64bit 정수를 표현할 수 있는 자료형으로

C99 에서 추가되었고, 대부분의 플랫폼에서 이미 구현되어 있을것입니다.

#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 에서는 제대로 먹는 것 같으니까
사용하시는데 큰 무리는 없으실 것으로 보입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.