您的位置:首页 > 其它

算法:最大公约数、斐波那契

2012-09-04 14:53 295 查看
其实求最大公约数有很多种方法

一下均以C++实现

欧几里得算法

记得在学小学的时候就会知道求两个数(m,n)的最大公约数    因为m=k*n+ p,其中n为除数,k为商,p为余数即m%n。从式子可以看出m,n的最大公约数也是k*n和p的最大公约数,因为其最大公约数小于等于n,所以这个最大公约数也是n,p的最大公约数,因此就出现了辗转相除发。在计算机中我们是这样子实现的。

int    gcd(int m,int n)

{

 if(m==0 || n==0)

   return  m==0?n:m;

else

   return gcd(n,m%n);

}

当然不使用递归的时候我们还是可以做的

int Euclid( int m, int n ) 

{

int r;
while(n!=0)
{
r=m%n;
m=n;
n=r;
}
return m;

}

而对于斐波那契来说,根据F
=F[n-1]+F[n-2];F[0]=0;F[1]=1;我们可以写出如下方法

int  Fab(int n)

{

  if(n==1 || n==2)

    return n-1;

return Fab(n-1)+Fab(n-2);

}

动态规划

int  Fab(int n)

{

    int *f=new int
;

    f[0]=0;

    f[1]=1;

    for(int i=2;i<n;i++)

       {f[i]=f[i-1]+f[i-2];

      }

  int tmp=f[n-1];

delete []f;

return tmp;

}

节省空间的动态规划

int Fab(int n)

{
int f[2];
f[0]=0;
f[1]=1;
int i=2;
for(;i<=n;i++)
{  f[i%2]+=f[(i+1)%2];
}
return f[i%2];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 delete ini c