相关文章推荐
温柔的紫菜汤  ·  mysql中Null ...·  1 年前    · 
豪爽的萝卜  ·  Java 堆栈信息对象 ...·  1 年前    · 
重情义的充电器  ·  Birthday attacks ...·  1 年前    · 

本文是参考 新浪博客 而写。
欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式
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;//cout<<a<<"与"<<b<<"的最大公约数是:"<<gcd1(a,b)<<endl;

欧几里得算法是最古老而经典的算法, 理解和掌握这一算法并不难, 但要分析它的时间复杂度却并不容易. 我们先不考虑模运算本身的时间复杂度(算术运算的时间复杂度在Knuth的TAOCP中有详细的讨论), 我们只考虑这样的问题: 欧几里得算法在最坏情况下所需的模运算次数和输入的a和b的大小有怎样的关系?
我们不妨设 a>b1 , 构造数列 {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 次后结束,因为每次迭代都会将问题的规模减小一半。 需要注意的是,这个时间复杂度是基于输入数据的二进制表示而言的。如果输入是以十进制或其他进制表示的话,时间复杂度可能会略有不同。但总体上,欧几里得算法时间复杂度都很高效,因为它的迭代次数与输入数据的大小无关。