整数中的1(二)

原创 2015年11月19日 16:05:18
描述
给出两个非负32位整型范围内的数a,b,请输出闭区间[a,b]内所有数二进制中各个位的1的总个数。
输入
有多组测试数据
每组测试数据只有一行,是两个整型数a,b(0<=a<=b<=150000000),空格分隔。
当a,b都是0时表示输入结束,该组输入不用计算。
测试数据的组数不超过1000组
输出
对于每组输入,输出区间[a,b]内所有数二进制中各个位的1的总个数。
样例输入
1 2
100 200
0 0
样例输出
2
419


本来想到要出一道求1-n中每个数的二进制为1的个数,当n小时,按普通方法就可以了,

当n比较大就需要找规律,将1-15列出来就会发现规律了

1

10

11

100

101

110

111

1000

1001

1010

1011

1100

1101

1110

1111

当二进制位为4位的时候前面2^3个1已经确定了,后面3位就是前面1-3位二进制的和吗?

所以就可以直接预处理就结果算出来,查询的时候只需要算一段就可以了,然后那

一段就可以通过每次去掉前面那个1得到。

#include <stdio.h>
#define LL long long
const int maxn = 55;
LL cnt[maxn], sum[maxn], bit[maxn];
void print ( LL a[] )
{
    for ( int i = 0; i < maxn; i ++ )
        printf ( "%lld ", a[i] );
    printf ( "\n" );
}
//发现位数是按1 2 4 8....增长
LL get_ans ( LL n )
{
    LL ans = 0, t;
    int begin;
    while ( n > 0 )
    {
        begin = 0;
        t = n;
        while ( t >= ( 1 << begin ) )
        {
            t = t-( 1 << begin );
            ans = ans+cnt[begin];
            begin ++;
        }
        if ( t == 0 )   //有可能是2^k-1,那么t就会为0就不需要算了
            break ;
        ans = ans+t;
        n = n & bit[begin]; //去掉前面那个1
    }
    return ans;
}
int main ( )
{
    LL n, m;
    sum[0] = cnt[0] = 1;
    for ( int i = 1; i < maxn; i ++ )
    {
        cnt[i] = ( 1 << i )+sum[i-1]; //将二进制位为i的个数求出来
        sum[i] = sum[i-1]+cnt[i];   //去掉前面一个1就变成i-1,变化即为前i-1的和
        bit[i] = ( 1 << i )-1;  //2^i-1取出最后i位
    }
    while ( ~ scanf ( "%lld%lld", &n, &m ), n || m )
    {
        if ( n == 0 )   //考虑n为0
            n = 1;
        printf ( "%lld\n", get_ans ( m )-get_ans ( n-1 ) );
        //相减就可以了
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

给一个正整数N,打印NxN的蛇形矩阵(二) 之空间复杂度O(1)

当N=4时,对应的蛇形矩阵如下图: 图 1 将该蛇形矩阵中元素的坐标代替其元素值时,得到如图2的矩阵,此时横坐标i和纵坐标j的和m=i+j具有一定的规律。当m为偶数时,原矩阵(图1中矩阵)中的...
  • tdmyl
  • tdmyl
  • 2013年10月21日 00:18
  • 3280

给一个正整数N,打印NxN的蛇形矩阵(二) 之空间复杂度O(1)

当N=4时,对应的蛇形矩阵如下图: 图 1 将该蛇形矩阵中元素的坐标代替其元素值时,得到如图2的矩阵,此时横坐标i和纵坐标j的和m=i+j具有一定的规律。当m为奇数时,原矩阵(图1中矩阵...

CUDA并行排序(1)——整数

  • 2017年12月06日 21:28
  • 1.2MB
  • 下载

1~10000个整数的哈密顿圈

  • 2015年02月08日 12:55
  • 48KB
  • 下载

0-1整数规划的LINGO求解

1.LINGO简介     LINGO是由美国LINDO公司推出的求解优化模型的软件,LINGO是使建立和求解线性、非线性和整数最佳化模型更快更简单更有效率的综合工具。官方提供免费试用版,可以在其官网...
  • Mr_Grit
  • Mr_Grit
  • 2015年05月08日 19:12
  • 4078

0-1整数规划的LINGO求解

  • 2015年05月09日 16:57
  • 15KB
  • 下载

【算法】组中元素全是1~n之间的整数问题

数组中数全是1~n的范围内的题 这部分之前是在LeetCode的好题总结里的,不过在打算给类似问题专题化之后,就单独把这部分拿了来了,然后又新加了一些总结和解法。 长度为n的数组,其中元素全部为1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:整数中的1(二)
举报原因:
原因补充:

(最多只允许输入30个字)