本文是参考
新浪博客
而写。
欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式
gcd(a, b) = gcd(b, a mod b)
其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 代码如下:
#include <iostream>
#include <math.h>
using namespace std;
int gcd1(int a,int b)
if (a<b)
int temp=a;
b=temp;
if (b==0)
return a;
return gcd1(b,a%b);
int gcd2(int a,int b)
if (a<b)
int temp=a;
b=temp;
while ( b!=0)
int c=a%b;
return a;
int main()
int a,b;
cout<<"请输入两个正数:"<<endl;
cin>>a>>b;
cout<<a<<"与"<<b<<"的最大公约数是:"<<gcd2(a,b)<<endl;
欧几里得算法是最古老而经典的算法, 理解和掌握这一算法并不难, 但要分析它的时间复杂度却并不容易. 我们先不考虑模运算本身的时间复杂度(算术运算的时间复杂度在Knuth的TAOCP中有详细的讨论), 我们只考虑这样的问题: 欧几里得算法在最坏情况下所需的模运算次数和输入的a和b的大小有怎样的关系?
我们不妨设
a>b≥1
, 构造数列
{un}:
求最大公约数的最常用的算法是欧几里得算法,也称为辗转相除法。问题定义为求i和j的最大公约数gcd(i,j),其中i和j是整数,不妨设i>j。算法可以递归的表示:
1.如果j能整除i,那么gcd(i,j)=j;
2.j不能整除i,令r=i%j,那么gcd(i,j)=gcd(j,r).
上面的算法对于i<j的情况也是可以的,实际上是做了一次交换。
使用C语...
设 a 和 b 的最大公约数为 c ;
则有 c = gcd( a , b ) ;
设 a = x * c , b = y * c , 其中 x 与 y 互质 (因为 c 是最大公约数)
设 g = a%b = a - i * b = (x - i * y )...
一,概念:
算法: 解决问题的简单指令的集合,比如排序就有很多种,虽然作用相同,但在过程中消耗的资源和时间却会有很大的区别。因而对一种算法分析它的时间复杂度是非常重要的。
时间维度: 执行当前算法所消耗的时间,即 时间复杂度。
表示形式: 算法的时间复杂度通常用大O符号大O符号大O符号表述, T[n]=O(f(n))T[n] = O(f(n))T[n]=O(f(n)) 。其含义为T(n)T(n)T...
代码 public static void main(String[] args) {
Random r = new Random();
for (int ii = 0; ii < 10; ii++) {
int num1 = r.nextInt(100);
int num2 = r.nextInt(80);
F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
欧几里得算法复杂度:
我们不妨设A>B>=1(若a<b我们只需多做一次模运算, 若B=0或A=B模运算的次数分别为0和1)
构造数列{Un}:
U0=a, U1=b, Uk=Uk-2mod Uk-1(k&...
辗转相除法是计算两个数最大公约数(Greatest conmmon divisor)的一种对数复杂度算法。
问题:有两个正整数 x , y ,求 gcd(x,y):
算法证明:
设 x > y , 且 x = r + y * c , 其中 r >= 0, c >= 0 ;
1. if r = 0 then gcd( x,y) == y 为结束条件)
2. if c = 0
欧几里得算法,也称为辗转相除法,用于计算两个非负整数的最大公约数(GCD)。算法的时间复杂度取决于输入的大小。
在最坏情况下,即给定两个数 a 和 b,其中 a > b,算法的时间复杂度可以近似地表示为 O(log b)。这个复杂度是根据辗转相除法的递归性质得出的。
具体来说,每次迭代中,算法将较大的数除以较小的数,并用余数取代原先的较大数。这样的迭代会在最多 log b 次后结束,因为每次迭代都会将问题的规模减小一半。
需要注意的是,这个时间复杂度是基于输入数据的二进制表示而言的。如果输入是以十进制或其他进制表示的话,时间复杂度可能会略有不同。但总体上,欧几里得算法的时间复杂度都很高效,因为它的迭代次数与输入数据的大小无关。