编程之美读书笔记-第二章

来源:互联网 发布:淘宝商城女装大码 编辑:程序博客网 时间:2024/05/22 14:19

1:求二进制中1的个数

下面是通过移位法来实现的,要先考虑第一位,每次取最右边一位,与0X01进行与操作,若是结果为1,则该位置数字为1,再将数字右移一位,再进行比较该位是否为1.


<span style="font-size:18px;">#include <iostream>#include <windows.h>using namespace std;int Count1(BYTE v){int num=0;while(v){num += v & 0x01;v>>=1;}return num;}void main(){BYTE v=11100110;cout<<Count1(v);}</span>

当输入的是int型的数字时呢?

<span style="font-size:18px;">#include <iostream>using namespace std;int findNumOf1(int k){int count = 0;unsigned int flag = 1;while (flag){if (k & flag){count++;}flag = flag<<1;}return count;}int main(){int val = 0; int ret;//cin>>val;val=11;ret = findNumOf1(val);cout<<ret;return 0;}</span>


2:

求N!中末尾0的个数:

<span style="font-size:18px;">#include <iostream>#include <fstream>using namespace std;//计算N阶乘末尾0的个数。//该问题等价于N阶乘的结果中因式分解中5的指数void main(){int ret=0;int j;for(int i=1;i<=100; i++){j =i;while(j%5==0){ret++;j /= 5;//对于作为5的指数次的数,贡献是多次的}}}</span>
另外一种方法:

<span style="font-size:18px;">#include <iostream>#include <fstream>using namespace std;//计算N阶乘末尾0的个数。//该问题等价于N阶乘的结果中因式分解中5的指数void main(){int ret=0;int N=100;while(N){ret += N/5;N /=5;}}</span>

3:求解N!的二进制表示中最低位1的位置

等价于2的质因数的个数+1,则可以用上述的方法。也可以按照位移动的方式:

<span style="font-size:18px;">#include <iostream>#include <fstream>using namespace std;void main(){int ret=0;int N=3;while(N){N>>=1;ret+=N;}}</span>





0 0
原创粉丝点击