티스토리 뷰

흔히 정수처리를 할 때 int만 쓰는데, 이 int로도 감당안되는 엄청나게 큰 수는 어떡할래? 라는 문제.

그냥 자료형 중 제일 큰 것을 쓰면 되지 않나 싶었는데 unsigned long int로도 해결이 안됐고, 구글링해서 찾은 __int64로도 값 처리가 안되는 엄청 큰 숫자다...

아쉬운 점은 내가 자료형 구글링하면서 이미 저 문제의 해결법들을 봐버렸다는 점.. ㅜㅜ

 

주어지는 입력값을 string으로 받고, answer 배열에 자리수마다 연산하여 저장하게 된다.

이 answer 배열의 크기는 a와 b중 더 긴 자릿수+1이 최대가 될것이다. (10 올림때문에)

    string a("9223372036854775807"),b("9223372036854775808");
    int aLen(a.length()), bLen(b.length());
    int num = aLen > bLen ? aLen : bLen;
    int needOne(0);
    int ans[num+1];

위에 말한대로 선언한 모습. needOne은 이전 자리 연산에서 자리올림이 있었을 때 이를 저장하고 이후 다음자리 연산에서 더해주는 용도이다.

 

자릿수는 0~num까지 진행한다. (총 num+1)

string의 at 연산으로 a와 b의 해당 자리의 수를 가져와 더하고, 이 값이 두자리 이상이라면 needOne값을 1로 바꾸고 %10을 해주는 방식이다.

    for(int i = 0; i < num+1; i++) {
        int aNow = aLen - i - 1 < 0? 0 : a.at(aLen-i-1) - '0';
        int bNow = bLen - i - 1 < 0? 0 : b.at(bLen-i-1) - '0';
        int result = aNow + bNow + needOne;
        if(result > 9) {
            result %= 10;
            needOne = 1;
        } else {
            needOne = 0;
        }
        ans[i] = result;
    }

aNow와 bNow를 보면 조건문이 보이는데, 이는 a와 b의 자릿수 차이가 날 시에 .at에 들어가는 매개변수가 음수가 될 수 있기 때문이다. 

그러니까, a는 18자리, b는 20자리라고 할 때 19번째 연산즈음에 a는 모든 값을 사용한 상태이기때문에 b.at(-1)이라는 이상한 접근을 할 수 있기 때문임.

 

ans 배열에 자리수만큼 저장되는데, 이를 출력하는데에는 2가지 유의점이 존재한다.

 

1. 1의 자리수부터 연산해서 저장했기 때문에, 저장값은 역순으로 되어있다는 점.

2. 만약 마지막 자리 연산에서 10의 올림이 발생하지 않았다면, 해당 배열 자리에는 0이 저장되어 있으며, 이를 무시하고 출력하면 0293223891과 같은 불필요한 0이 출력된다는 점.

 

    if(ans[num] != 0) {
        cout << ans[num];
    }

    for(int j = num-1; j >= 0; j--) {
        cout << ans[j];
    }

으로 결과값 출력까지 마무리했다.

 

위의 코드에서는 테스트를 위해 직접 값을 입력했으니 그 부분만 바꿔서 제출한다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함