zoukankan      html  css  js  c++  java
  • 算法题5 二进制中1的个数

    题目

      输入一个整数,判断该正数的二进制表示中有多少个1?如整数7,二进制为0111,共3个1.

    分析

      整数n,如果n大于0,则其二进制形式至少有一位是1,如果将一个二进制数减1,那么这个二进制数的最右边的1将变成0,而这个1后面的0将全部变成1。例如二进制数1100,减1后是1011。这两个数相与的话,最右边的1及其后面的数均会变成0,这样就消掉了n最右边的1个1。因此对整数n循环减1相与,直至n=0,循环的次数就是二进制中1的个数。

    代码

    int TrueBitCounts(unsigned int n)
    {
    	int count=0;
    	while (n>0)
    	{
    		n=n&(n-1);
    		count++;
    	}
    
    	return count;
    }
    

    延伸:如果n可能是负数呢?

    int TrueBitCounts(int n)
    {
    	int count=0;
    	int num=(n>0)?n:-n;
    	while (num>0)
    	{
    		num=num&(num-1);
    		count++;
    	}
    
    	return (n>0)?count:count+1;
    }
    

     

    延伸:对于一个1*2*3*···n的连续乘积,结果的末尾有多少个0呢?

      对于一串数字的乘积结果来说,结尾0的个数和这串数字中的2因子和5因子的个数有关系。当2的因子个数多余5时,和5因子的个数有关,反之和2因子的个数有关,如2*3*5*15这样一串数有1个2因子,有两个5因子,因此结果末尾有1个0

      对于连续的一串数字来说,2因子的个数明显多余5因子,所以只要计算这串数字中含有因子5的个数即可

     1  int NumOfZero(unsigned int n)
     2  {
     3      int count=0;
     4      int pow=5;
     5      while(n/pow>0)
     6      {
     7          count+=n/pow;
     8 
     9          pow*=5;
    10      }
    11      return count; 
    12  }

     

  • 相关阅读:
    数据库信息 (表名 行数 堆 集群 非聚集)的查询
    jquerygalleryview2.0 漂亮多样化的图片特效(多项自定义)
    枚举 EnumDescription 位运算 权限 sql c#
    vs2010缓存类
    透明遮罩层
    app_offline.htm的作用
    XmlToJSON(c#)
    jquery性能最佳实践
    .net面试问答(大汇总)
    apk反编译
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5167167.html
Copyright © 2011-2022 走看看