斐波那契数列
一般教材都是用的递归
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;
}