链接:
http://acm.gdufe.edu.cn/Problem/read/id/1206
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 <= 5*10^8)
Output:
每组数据输出一行,对应的ans
Sample Input:
1
2
3
Sample Output:
1
3
4
首先, lowbit (i) = i&-i
for(int i = 1; i < 100; i++)
printf(“%d\n”, lowbit(i) );
观察其规律,可以发现:
i为 1,3,5,7,9…时,lowbit(i) == 1,
i为 2,6,10,14,18…时,lowbit(i) == 2,
i为 4,12,20,28,36…时,lowbit(i) == 4,
i为 8,24,40,56,72…时,lowbit(i) == 8…
代码:
#include <stdio.h>
#include <math.h>
int main(){
int n;
while(scanf("%d", &n) == 1){
int p = (int)log2(n);
long long ans = 0;
for(int i = 0; i <= p; i++){
ans += ((n - (1 << i)) / (1 << (i+1)) + 1) * (1 << i);//懒得描述。。。反正根据规律可以推出来
}
printf("%lld\n", ans);
}
return 0;
}
//需要注意:<<的优先级比-低