문제

https://www.acmicpc.net/problem/19946

걸린 시간

-

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    ull n;
    cin >> n;
    int k = 1;
    while(k <= 64){
        ull mistake = 1; // 2^0
        for(int i = 1; i <= k; i++) 
            mistake *= 2;
        mistake -= 1;
        for(int i = k+1; i <= 64; i++)
            mistake *= 2;
        if(mistake == n)
            break;
        k++;
    }
    cout << k;
    return 0;
}

unsigned long long 자료형을 사용해야하고, pow 함수는 부동소수점 오차 문제가 발생하기 때문에 반복문으로 2씩 일일이 곱해주어야 올바르게 계산된다.

참고

[C/C++] pow() 함수 사용자는 반드시 알아야 하는 주의사항

'Baekjoon' 카테고리의 다른 글

Baekjoon 13417번 카드 문자열  (0) 2020.09.27
Baekjoon 20001 고무오리 디버깅  (0) 2020.09.27
Baekjoon 1022번 소용돌이 예쁘게 출력하기  (0) 2020.09.24
Baekjoon 2225번 합분해  (0) 2020.09.23
Baekjoon 10800번 컬러볼  (0) 2020.09.23

댓글