【递归】小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;
}