奇怪的函數 題解

Description:

使得 x^x 達到或超過 n 位數字的最小正整數 x 是多少?c++

Input:

一個正整數 n函數

Output:

使得 x^x 達到 n 位數字的最小正整數 xspa

Example Input:

11debug

Example Output

10code

Data Range:

n <= 2000000000 (2e9)ip


Difficulty: ★★☆☆☆

Thoughts:

看到如此之大的數據範圍,顯然強行計算x^x的位數是不現實的,不只須要高精度,並且效率極低。
題目的核心在於如何計算x^x的位數,能夠利用對數的方法,log10(x)就是x的位數。
也就是 log10(x ^ x) >= n - 1
如此斷定方法就是簡單了,代碼形式就是 x * log(x) / log(10)(換底公式) >= n - 1
求最小,很明顯是二分搜索,二分套一個判斷函數就完成了此題。input


AC代碼:

// Skq_Liao

#include <bits/stdc++.h>
using namespace std;

#define FOR(i, a, b) for (register int i = (a), i##_end_ = (b); i < i##_end_; ++i)
#define ROF(i, a, b) for (register int i = (a), i##_end_ = (b); i > i##_end_; --i)
#define debug(...) fprintf(stderr, __VA_ARGS__)

const int MAXN = 1000000000;

bool CountFigure(long long x, int n)
{
    return x * (log(x) / log(10)) >= n - 1;
}

void BinarySearch(int l, int r, int n)
{
    int ans;
    while(l <= r)
    {
        int mid = (l + r) >> 1;
        bool cur = CountFigure(1ll * mid, n);
        if(cur)
        {
            r = mid - 1;
            ans = mid;
        }
        else
            l = mid + 1;
    }
    printf("%d\n", ans);
    return ;
}

int main()
{
#define Bxy
#ifdef Bxy
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    int n;
    scanf("%d", &n); 
    BinarySearch(0, MAXN, n);
    return 0;
}

總結:

此題的核心就是判斷位數,碰到一次後就沒有任何難度了。it

Skq_Liao 2017/06/29 18 : 05 於209io

相關文章
相關標籤/搜索