gdufe acm 1206 lowbit

来源:互联网 发布:mastercam车铣复合编程 编辑:程序博客网 时间:2024/05/17 21:44

链接:
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;}//需要注意:<<的优先级比-低
0 0
原创粉丝点击