【遞迴】小q的數列

peterzh6發表於2024-10-02

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;
}

相關文章