求最大公因数(辗转相除,更相止损)C++描述

Posted 归止于飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大公因数(辗转相除,更相止损)C++描述相关的知识,希望对你有一定的参考价值。

目录

辗转相除法与更相减损法

辗转相除法

如何求最大公因数?欧几里得先生提出了辗转相除法,这也是已知最古老的算法。
这个算法基于一个定理:
两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。

更相止损法

当a,b两数较大时,求模的运算性能较低,我们就需要运用到刘徽先生的《九章算术》里的算法,更相止损法。
它遵循的定理是:两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。

利用C++实现

我们可以用递归/迭代的方法实现这样两个算法.

/* 记录更相止损法与辗转相除法 */
#include <iostream>

using namespace std;

//辗转相除法
void zhanzhuan(int a, int b);
//更相止损法
void gengxiang(int a, int b);

//辗转相除的辅助函数
void f_zhanzhuan(int a, int b);
//更相止损法的辅助函数
void f_gengxiang(int a, int b);
//确定数字的大小为左大右小
void f_min(int& a, int& b);

int main()

    int numberA, numberB;
    
    cout << "请输入两个数:";
    cin >> numberA >> numberB;
    zhanzhuan(numberA, numberB);
    
    cout << "请输入两个数:";
    cin >> numberA >> numberB;
    gengxiang(numberA, numberB);
    
    //将终端暂停
    cin.get();
    cin.get();
    return 0;


void zhanzhuan(int a, int b)

    f_min(a, b);
    f_zhanzhuan(a, b);


void f_zhanzhuan(int a, int b)

    int c,temp;
    while (1)
    
        if (a % b == 0)
        
            c = b;
            break;
        
        else
        
            temp = b;
            b = a % b;
            a = temp;
        
    
    cout << c << endl;


void gengxiang(int a, int b)

    f_min(a, b);
    f_gengxiang(a, b);


void f_gengxiang(int a, int b)

    int c, temp;
    while (1)
    
        if (a == b)
        
            c = a;
            break;
        
        else
        
            temp = a - b;
            f_min(b,temp);
            a = b;
            b = temp;
        
    
    cout << c << endl;


void f_min(int& a, int& b)

    int temp;
    if (a < b)
    
        temp = a;
        a = b;
        b = temp;
    

总结

这里用的是比较暴力的迭代,但是换成递归的话应该会更加优雅。
此外我利用了几个辅助函数以便于代码的重用,其实也可以用选择语句代替。

以上是关于求最大公因数(辗转相除,更相止损)C++描述的主要内容,如果未能解决你的问题,请参考以下文章

求最大公因数(辗转相除,更相止损)C++描述

辗转相除法与更相减损数

辗转相除法求最大公因数

求两个数的最大公约数,辗转相除法与更相减损法(递归迭代)

辗转相除法求两数的最大公约数的原理是啥?

谁来解释一下用辗转相除法求最两个数的最大公约数原理