这道题目本来一开始是想要搞暴力的,但是第一个就超时.不得已换了个数学方法.
首先用小学生都会的数列求和:(首项+末项)*项数/2 把从1...n的和算出来,然后计算出不大于n的2的幂次共有多少个,用等比数列求和公式求出它们的和,减去两倍即可.
while(m2<=n)m2*=2;
其实做这道题是要数学功底的.我还是把具体的推导过程说一下好了.我们想要求出小于n的所有2的幂次方项之和,根据等比数列求和公式可知:$$2^0+2^1+2^2+...+2^n=2^{n+1}-1$$所以我们只要找到最大的小于n的2的幂次再乘2减1就可以了.具体代码可参见函数try2().