算法:最大公约数、斐波那契
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];
}
一下均以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];
}
相关文章推荐
- 201708310807_《算法-Javascript实现最大公约数》
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 二进制最大公约数算法
- ADV-92-算法提高-求最大公约数.
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 每日一道算法题:求N个整数的最大公约数
- C语言求最小公倍数和最大公约数三种算法
- JS求最小公倍数(高效算法2—利用最大公约数和递归调用)
- 世界上最早的算法:辗转相除法(求两个自然数最大公约数)
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- php取两个整数的最大公约数算法大全
- C语言求最小公倍数和最大公约数三种算法
- 最大公约数的相关算法
- 一步一步写算法(之 最大公约数、最小公倍数)
- 时间复杂度最小的 求两个整数最大公约数算法
- 最大公约数算法 辗转相除法解析
- c语言经典题算法1--用辗转相除法求两个数的最大公约数
- 求取两个整数的最大公约数算法
- 使用三种算法解决从键盘输入两个整数,输出两个整数的最大公约数的问题