nyoj-222 整数中的1

来源:互联网 发布:webpack java 编辑:程序博客网 时间:2024/04/28 02:49

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=222

整数中的1

时间限制:3000 ms  |  内存限制:1000 KB
难度:4
描述
给出两个非负32位整型范围内的数a,b,请输出闭区间[a,b]内所有数二进制中各个位的1的总个数。
输入
一行,给出两个整形数a,b(0<=a<=b<=150000000),空格分隔。
输出
一行,输出结果
样例输入
1 2
样例输出
2
 #include<stdio.h>typedef long long LL ;LL get_sum(LL x){    if(x <= 0) return 0;    LL k = 0 ;    LL n = x ;    LL sum = 0 ,y;    LL r = 1 ;    while(x)    {        k ++ ;        r *= 2 ;        y = 0 ;        LL s = (n + 1) / r ;        LL t = (n + 1) % r ;        if(t > r/2) y = t - r/2 ;        sum += (y + s *(r/2)) ;        x >>= 1;    }    return sum ;}int main(){    LL d,b;    while(scanf("%lld%lld",&d,&b)!=EOF)    {        printf("%lld\n",get_sum(b)-get_sum(d-1));    }}        

题解看图:


0 0
原创粉丝点击