Problem Description
long long ans = 0;
for(int i = 1; i <= n; i ++)
ans += lowbit(i)
lowbit(i)的意思是将i转化成二进制数之后,只保留最低位的1及其后面的0,截断前面的内容,然后再转成10进制数
比如lowbit(7),7的二进制位是111,lowbit(7) = 1
6 = 110(2),lowbit(6) = 2,同理lowbit(4) = 4,lowbit(12) = 4,lowbit(2) = 2,lowbit(8) = 8
每输入一个n,求ans
Input
多组数据,每组数据一个n(1 <= n <= 10^9)
Output
每组数据输出一行,对应的ans
Sample Input
1 2 3
Sample Output
1 3 4
/* * this code is made by QuQ * Problem: 1154 * Verdict: Accepted * Submission Date: 2014-07-31 11:59:02 * Time: 188MS * Memory: 1676KB */ #include <iostream> #include <cmath> using namespace std; typedef long long LL; LL n, ans; int main() { while (cin >> n) { ans = 0; if (n % 2 == 0) ans += n / 2; else ans += (n / 2 + 1); n /= 2; int k = 2, cnt = 0; while (n) { cnt = (int)ceil(double(n) / 2); ans += k * cnt; k *= 2; n /= 2; } cout << ans << endl; } return 0; }