编程之美--做题笔记(1)

来源:互联网 发布:linux 最新版qq 编辑:程序博客网 时间:2024/06/04 19:10

1.求2进制数中1的个数

#include "stdafx.h"

 

int count(int v){

         intnum =0;

         while(v){

                   //右移一位,看最低位是否为1

                   num+= v & 0x01;

                   v>>= 1;

         }

         returnnum;

}

 

int count2(int v){

         intnum = 0;

         while(v){

                   //v与v-1的按位与,会从低位到高位消掉1.如1010 & (1010 - 1) = 1010 & 1001 = 1000

                   v= v &  (v-1 );

                   num++;

         }

         returnnum;

}

int main(int argc, char* argv[])

{

//      printf("HelloWorld!\n");

printf("%d\n",count(236455));

printf("%d\n",count2(236455));

         return0;

}

 

结果:

12

12

 

2.求N!中末位0的个数

//N! = ( 2 的x 次方 )+( 3 的y次方) + ( 5 的z次方),可见N!中含有0的个数等于(x,z)的最小值,明显

//x是大于z的,只需求z的值

//求小于N中每个数含有5的因子数

int factor0Num(int N){

         intnum = 0;

         for(inti=1; i <=N; i++){

                   intj = i;

                   while(j % 5 == 0 ){

                            num+= 1;

                            j= j/5;

                   }

         }

         returnnum;

}

 

// Z = [ N /5 ] + [N/25] + [N/125] + ......

//即在[N/5]小于Z的数中每个数 先贡献一个5 ,比如 35 != 1 *2 * 3...* 35 ,这里共有7个数含有5

//[N/25] 小于Z的数中每个数中能贡献 25 的个数

int factor0Num2(int N){

         intnum = 0;

         while(N){

                   num+= N /5;

                   N/= 5;

         }

         returnnum;

}

 

int main(int argc, char* argv[])

{

 

//printf("%d\n",count2(236455));

 

printf("%d\n",factor0Num(100));

printf("%d\n",factor0Num2(100));

 

         return0;

}

结果

24

24

原创粉丝点击