简单的C++程序题总结

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\n",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;
}
posted @ 2014-08-30 15:03  啵啵那个臭  阅读(197)  评论(0编辑  收藏  举报