https://ac.nowcoder.com/acm/contest/21763/1002
pow(2, ans) 計算的是2的ans次冪,但是 pow() 函式返回的是 double 型別的結果。由於 pow() 函式主要用於浮點數計算,它返回浮點數結果,而後你可能需要對該結果進行整數操作。如果不進行顯式型別轉換,這個浮點數結果會丟失精度,特別是在大數情況下。這就是為什麼需要將 pow() 的結果顯式轉換為 long long 型別(即 ll),以避免潛在的精度丟失並確保計算結果是整數。
為什麼要使用 (ll) 顯式轉換
浮點數在表示大整數時可能不精確,尤其是當指數較大時。例如,pow(2, 50) 的返回值為 1125899906842624.0,
要避免使用 pow() 並且使用位運算來計算 2^n,可以透過左移操作(<<)來實現。位運算中的左移操作是非常高效且精確的。具體來說,1 << n 就相當於 2^n。因為在二進位制表示中,左移操作會將數字左移 n 位,相當於乘以 2^n。
cout << f(n) << " " << ( (1LL << ans) - 1 ) << endl;
原始碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll n) {
if(n == 0 || n == 1) {
return n;
}
return f(n/2) + n%2;
}
int main() {
int t;
cin >> t;
while (t--) {
ll n;
cin >> n;
ll sum = 0;
ll ans = f(n);
cout<<f(n)<<" "<<(ll)pow(2,ans)-1<<endl;
}
return 0;
}