关于C/C++中求最大公约数的算法

1.更相减损法

int gcd(int a,int b)
{
    while(a!=b)
    {
       if(a>b)
           a-=b;
       else
           b-=a;
    }
    return a;
}

2.辗转相除法--递归

int gcd(int a,int b)
{
    if(b==0)
       return a;
    else
       return gcd(b,a%b);
}

3.辗转相除法--纯循环

int gcd(int a,int b)
{
    int r;
    while(b!=0)
    {
       r=a%b;
       a=b;
       b=r;
    }
    return a;
}
时间: 2024-10-09 23:11:33

关于C/C++中求最大公约数的算法的相关文章

[转]求最大公约数的算法

更相减损术 更相减损术,又称"等值算法" 关于约分问题,实质是如何求分子,分母最大公约数的问题.<九章算术>中介绍了这个方法,叫做”更相减损术”,数学家刘徽对此法进行了明确的注解和说明,是一个实用的数学方法. 例:今有九十一分之四十九,问约之得几何? 我们用(91,49)表示91和49的最大公约数.按刘徽所说,分别列出分子,分母. “以少减多,更相减损,求其等也,以等数约之,等数约之,即除也,其所以相减者皆等数之重叠,故以等数约之.” 译文如下: 约分的法则是:若分子.分母

求最大公约数的算法以及最小公倍数

短除法: #include<stdio.h> #include<stdlib.h> int max_approximate(int num1, int num2) { if (num1 > num2) { int tmp = 0; tmp = num1; num1 = num2; num2 = tmp; } int min = num1; while (min) { if ((num2%min == 0)&&(num1%min==0)) { return mi

两非负整数求最大公约数(欧几里德算法)---C/C++

#include<iostream> using namespace std; //欧几里德算法求两个非负整数的最大公约数 int getDivisor(int a,int b) { int max,min; max = a; min = b; //两数中大数模小数,若结果不为0,则舍弃大数 ,把小数和模运算的结果分出大小来,继续取模运算 //依次递归求解,直到模运算结果为0,则此时的小数就是最大公约数 if(max%min!=0){ if(max%min>min) return get

欧几里得求最大公约数

问题:快速求取正整数a,b的最大公约数? 欧几里得算法(又称辗转相除法) 定理:gcd(a,b) = gcd(a,a mod b) 证明:对于任何正整数a,b.如果a>b,都有a=k*b+r  即r=a-k*b =>  r=a mod b. 假设d为a,b的公约数,则a=a1*d,b=b1*d. 而r=a1*d-k*b1*d=(a1-k*b1)*d  =>  d也是r的约数 => d也是(a,r)的公约数 则说明(a,b)的公约数也就是(a,r)的公约数.因此gcd(a,b)=gc

辗转相除 求最大公约数!or 最小公倍数

求最大公约数和最小公倍数的经典算法--辗转相除法描述如下: 若要求a,b两数的最大公约数和最小公倍数,令a为a.b中较大数,b为较小数,算法进一步流程: while(b不为0) { temp=a%b: a=b: b=temp } 最后a即为两数的最大公约数,最大公倍数为: a*b/最大公约数 c语言代码: 01.int divisor (int a,int b) /*自定义函数求两数的最大公约数*/ 02.{ 03. int temp; /*定义整型变量*/ 04. if(a<b) /*通过比较

31、求最大公约数和最大公倍数

求最大公约数和最大公倍数 一.求三个数的最大公约数和最大公倍数 /* 时间:2017年6月30日20:14:33 功能:求三个数的最大公约数与最小公倍数 */ # include <stdio.h> main() { int x, y, z, a, b, min, max; printf("请输入三个整数以空格分隔:"); scanf("%d %d %d", &x,&y,&z); if(x<y) { min = x; max

递归--练习3--noi7592求最大公约数问题

递归--练习3--noi7592求最大公约数问题 一.心得 两个低级错误:1. ll setMax(ll &m,ll &n)中无引用,结果只传值,没传地址2. return f(n,m%n);这句话忘记写return了 //保证结果能够一层层的返回 二.题目 7592:求最大公约数问题 总时间限制:  1000ms 内存限制:  65536kB 描述 给定两个正整数,求它们的最大公约数. 输入 输入一行,包含两个正整数(<1,000,000,000). 输出 输出一个正整数,即这两个

(hdu 2.1.4)又见GCD(求最大公约数GCD的变化题)

题目: 又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2685 Accepted Submission(s): 1327   Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n,

C语言求最大公约数和最小公倍数

求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和