본문 바로가기

백준

1834 나머지와 몫이 같은 수

정답률 낮을 때부터 알아봤어야 했다.. 정답률이 저런데 문제는 쉬워서 이상하다 생각했지

 

그냥 단순히 나머지를 기준으로 수를 구하려고 했다. 입력이 2000000이라 터질 껄 예상해서 long long으로 받았다. 그런데 또 어디선가 문제 생겼나보다ㅎㅎ 

 

#include <iostream>
using i64 = long long;
int main() {
    int n;
    i64 sum = 0;
    scanf("%d", &n);
    
    for(int i = 1; i < n; i++){
        sum += i*n + i;
    }
    
    printf("%lld", sum);
    return 0;
}

흑흑.. 뭐가 문제야.. 이것도 내일 다시봐야겠다. 


음.. 로직은 맞고 틀렸다면 터져서 틀린 것 같았다. 

계산해봤더니 터질 수도 있겠다 싶었다. 그래서 unsigned long long을 써서 했다. 하지만 결과는 long long과 같다.. 뭐가 문제인지 모르겠음..

 

#include <iostream>
using i64 = unsigned long long;
int main() {
    i64 n;
    i64 sum = 0;
    scanf("%lld", &n);
    
    for(i64 i = 1; i < n; i++){
        sum += i*n + i;
    }
    
    printf("%llu", sum);
    return 0;
}

엥.. 엉...

엥..

n은 int 범위로 받을 수 있어서 그냥 int로 받았는데 이걸 long long으로 고치니깐 해결됐다.. 엥.. 엉.. 엥...

내 생각에는 i와 n이 int형이라 계산결과가 int가 된 건가.. 음.. 엉.. 

 


i와 n이 int형이라 계산 결과가 int형이고 sum에 더할 때 i64로 변경하기 때문에 이미 오버플로우가 발생한 상태로 값을 넣게 된다ㅋㅋㅋㅋ 계산하는 값중 하나라도 64비트면 결과도 64비트로 맞춰지지만 (암시적 형변환은 작은 쪽이 큰 쪽에 맞춤) 둘다 32비트면 결과도 32비트가 된다. 알아두자!

 

 

'백준' 카테고리의 다른 글

1408 24  (0) 2019.10.27
2578 빙고  (0) 2019.10.26
2851 슈퍼마리오  (0) 2019.10.25
2460 지능형기자 2  (0) 2019.10.25
11365 !밀비급일  (0) 2019.10.25