首页 > 学院 > 开发设计 > 正文

gdufe acm 1206 lowbit

2019-11-14 12:37:40
字体:
来源:转载
供稿:网友

链接: 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;}//需要注意:<<的优先级比-低
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表