以下是我在采访街网站上看到的 C++ 代码,它从 0 ~ a(输入数字)开始计算 1 的位,我们可以说是 1 ~ a 虽然因为 0 没有 1。这段代码的时间复杂度是 O(logn) 使用递归。
我只是不明白其中的逻辑。谁能解释为什么?谢谢!
long long solve(int a)
{
if(a == 0) return 0 ;
if(a % 2 == 0) return solve(a - 1) + __builtin_popcount(a) ;
return ((long long)a + 1) / 2 + 2 * solve(a / 2) ;
}
BTW __builtin_popcount() 是 GNU 提供的一种内置方法,用于计算位为 1 的位。