剑指offer之二进制中的1的个数与斐波那契数列

来源:互联网 发布:什么视频会议软件好 编辑:程序博客网 时间:2024/05/16 17:01

斐波那契数列

一般教材都是用的递归

long long F(unsigned int n){    if(n<=0)       return 0;    if(n==1)        return 1;    return F(n-1)+F(n-2);}

但是这种方法随着n的增大,时间复杂度以指数的方式递增,所以可采用下面这种方法。

long long Fibonacci2(unsigned n){    if(n<2)        return n;    long long FibNumZero=0;    long long FibNumOne=1;    long long FibNumN;    for(int i=2;i<=n;i++)    {        FibNumN=FibNumZero+FibNumOne;        FibNumZero=FibNumOne;        FibNumOne=FibNumN;    }    return FibNumN;}

时间复杂度为O(n)。

二进制中的1的个数

两种解法,第一种如果是32位,则循环32次,第二种有多少个1,就循环几次,其他方法实现时要注意计算机中负数是以补码方式表示的。

#include<iostream>using namespace std;int NumberOf1A(int n){    int count = 0;    unsigned int flag = 1;    while(flag)    {        if(n & flag)            count++;        flag=flag<<1;    }    return count;}int NumberOf1B(int n){    int count=0;    while(n)    {        n=n&(n-1);        count++;    }    return count;}void test(int n,int expect){    if(NumberOf1A(n)==expect)        cout<<"NumberOf1A  pass"<<endl;    else        cout<<"NumberOf1A  fail"<<endl;    if(NumberOf1B(n)==expect)        cout<<"NumberOf1B  pass"<<endl;    else        cout<<"NumberOf1B  fail"<<endl;}int main(){    test(0,0);    test(4,1);    test(1,1);    test(0x80000000, 1);    return 0;}
0 0