使得 x^x 達到或超過 n 位數字的最小正整數 x 是多少?c++
一個正整數 n函數
使得 x^x 達到 n 位數字的最小正整數 xspa
11debug
10code
n <= 2000000000 (2e9)ip
看到如此之大的數據範圍,顯然強行計算x^x的位數是不現實的,不只須要高精度,並且效率極低。
題目的核心在於如何計算x^x的位數,能夠利用對數的方法,log10(x)就是x的位數。
也就是 log10(x ^ x) >= n - 1
如此斷定方法就是簡單了,代碼形式就是 x * log(x) / log(10)(換底公式) >= n - 1
求最小,很明顯是二分搜索,二分套一個判斷函數就完成了此題。input
// 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