1、求一个数的二进制中1的个数。
思想的关键在于x=x&(x-1)这里,例如二进制为0x0729,即x=0000 0111 0010 1001,那么x-1=0000 0111 0010 1000,经过与运算,都为1的时候才为1,可得x&(x-1)=0000 0111 0010 1000,成功的把x的最后一个1变为0了,通过循环可得所有1的个数。
#include <stdio.h> int func(int x) { int countx=0; while(x){ countx++; x=x&(x-1); } return countx; } int main(int argc, char **argv) { printf("%d ",func(9999)); return 0; }
2、n!的后门连续0的个数。
对于一个数n的阶乘 n! ,计算其后面有几个连续的零。 我们知道,10 = 2 * 5。每一个 2 与一个 5 相乘,结果就增加一个零。所以求 n! 后面的连续零的个数,其实就是求其中相乘的数含有因子每对因子 2 与 5 的个数。又因为从1到某个数,所含 2 的个数比 5 多,所以问题就可以进一步简化到求含有因子5的个数。
#include <iostream> #include <string> using namespace std; int zeroCount ( int n) { int counter = 0; while(n){ counter+=n/5; n/=5; } return counter; } int main() { cout<<zeroCount(100)<<endl; system("pause"); return 0; }