【递归】小q的数列

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

posted @ 2024-10-02 15:24  peterzh6  阅读(3)  评论(0编辑  收藏  举报