C语言如何利用辗转相除法求最大公约数

 更新时间:2023年08月10日 09:51:44   作者:Sandm *  
这篇文章主要介绍了C语言如何利用辗转相除法求最大公约数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C语言利用辗转相除法求最大公约数

1. 首先要明确几个概念

最大公约数: 也叫最大公因数,是指俩个或多个整数公有约数中最大的一个。

例如,18 和 24的最大公约数是 6

最小公倍数:除0以外最小的一个公倍数就叫作这几个整数的最小公倍数

例如,18 和 24的最小公倍数是 72

2. 辗转相除法

用除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数

例如:求 1997 和 615 俩个正整数的最大公约数

因为:

1997 % 615 = 152
615 % 152 = 7
152 % 7 = 5
7 % 5 = 2
5 % 2 = 1
2 % 1 = 0

所以,1997 和 615 的最大公约数为 1

3. C语言代码实现

#include <stdio.h>
int main()
{
    int data1 = 0, data2 = 0;
    int m = 0;     //该变量是中间变量,不能放在while函数的内部
    scanf_s("%d %d", &data1, &data2);
    while ((m = data1 % data2) != 0)
    {
        data1 = data2;
        data2 = m;
    }
    printf("最大公约数为%d\n", data2);
    return 0;
}

注意点:

对于求模运算符%,若是分数形式求余数的话,如果分子小于分母,则分子就是余数。

例如:2 % 5 = 0

而当不是分数形式求余数的话,即例如:18 % 24 时,可将 % 左边的内容看成是分子,而 % 右边的内容看成是分母。所以 18 % 24 = 18

这里有一个误区,不能将18 与 24 在都约去 6 的情况下去求它们的余数,所以 18 % 24(3 % 8)= 3 是错误的

而不管是 18 % 24 ,还是24 % 18 。它们的余数均不会成为0

如果知道了俩个数的最大公约数,那么其最小公倍数可以根据公式来确定

即最小公倍数 = 俩个数的乘积 / 最大公约数

C语言求最大公约数常见思路

辗转相除法

辗转相除法又称为欧几里得算法,用于求两数的最大公约数gcd(全称为greatest common divisor)

注意两数必须为非负整数a,b。用法为:用两数中较大的数(a1)除以较小的数(b1),得到余数(r1),再用b1除以r1得到余数r2,之后再用r1除以r2,反复进行,直到最后余数是0为止。最大公约数就是最后式子中的除数。

请看如下举例:

 若用函数gcd(a,b)来表示,即gcd(a,b)=gcd(b,a%b),我们可以这样理解:3887 2231和2231 1656的最大公约数是相等的,依次类推、重复操作。

用表达式可以这样来表示:gcd(3887,2231)=gcd(2231,1656)=gcd(1656,575),直到最后到底gcd(a,b)=gcd(c,0),即gcd(3887,2231)=gcd(23,0)。

这里的c为a和b的最大公约数。

下面来看辗转相除法的图像说明

维基百科动态图

下面看算法实现:

算法实现一

 

代码中的a就相当于上述gcd(a,b)=gcd(c,0)中的c。当然还有利用此原理的其他写法,不过是大同小异,这里就不一一列举了。这里的if语句其实是多余的,因为通过辗转相除完全可以实现两数之间的互换。

算法实现二(函数递归法

 对辗转相除足够熟悉后,可以采用递归的方式,如算法实现三

算法实现三(递归思想)

总之一句话:除数除以余数,直到余数为0为止。

更相减损之术

更相减损之术出自我国《九章算术》,原文是这样的:

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

算法过程:大数减小数,得到的差用来替换之前的大数,如此反复,直到得出来的差与上次的减数相等。此时的这个差就是两者的最大公约数。

以 36 24为例(如下图):

 可以这样表示:gcd(36,24)=gcd(24,12),即36 24和24 12的最大公约数是相等的。

下面来看代码实现

 总归一句话:用大数减去小数,知道减数和差相等。

最后,当处理较大的数时,辗转相除法虽然在时间上有明显优势。但是,即使是这样,辗转相除法也同样存在缺陷,其在处理较大的素因数(也叫质因数,就是说一个数是另一个数的因数,本身又是质数,就叫做另一个数的素因数)时,缺陷就会显现出来。

当然,实现求取最大公约数还有很多其他方法,这里只进行了常见思路的讲解。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于C语言实现猜数字游戏

    基于C语言实现猜数字游戏

    这篇文章主要为大家详细介绍了基于C语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 基于Matlab实现俄罗斯方块游戏

    基于Matlab实现俄罗斯方块游戏

    俄罗斯方块是一个最初由阿列克谢帕吉特诺夫在苏联设计和编程的益智类视频游戏。本文将利用Matlab实现这一经典的小游戏,需要的可以参考一下
    2022-03-03
  • C语言实现简易贪吃蛇游戏的示例代码

    C语言实现简易贪吃蛇游戏的示例代码

    这篇文章主要介绍了如何利用C语言实现一个经典的小游戏——贪吃蛇,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-10-10
  • C++实现简单的信息管理系统

    C++实现简单的信息管理系统

    这篇文章主要为大家介绍了C++实现简单的信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C/C++中获取重载函数地址的方法

    C/C++中获取重载函数地址的方法

    函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表不同,常用来处理实现功能类似数据类型不同的问题,本文给大家介绍了C/C++中获取重载函数地址的方法,需要的朋友可以参考下
    2024-04-04
  • c++中new和delete操作符用法

    c++中new和delete操作符用法

    c++中new和delete运算符是用于动态分配和撤销内存的运算符,下面是示例,大家参考使用吧
    2014-04-04
  • C++ OpenCV绘制简易直方图DrawHistImg

    C++ OpenCV绘制简易直方图DrawHistImg

    本文主要介绍了一个能绘制简易直方图的简单函数DrawHistImg,可以帮助大家快速掌握绘制的原理,可以根据自己的创意对其进行改善和补充。需要的朋友可以参考一下
    2021-12-12
  • 简单谈谈C++ 头文件系列之(algorithm)

    简单谈谈C++ 头文件系列之(algorithm)

    <algorithm>是c++特有的STL模板的算法头文件 包含了一些特定的算法函数 包括sort(),stable_sort(),partical_sort(),nth_element()等常用的算法函数
    2017-02-02
  • C++实现高性能转换大小写算法示例

    C++实现高性能转换大小写算法示例

    大小写转换是我们作为一名程序员经常会遇到,也必须要会的一个功能,下面这篇文章主要给大家介绍了关于C++实现高性能转换大小写算法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-01-01
  • 详解C++程序中定义struct结构体的方法

    详解C++程序中定义struct结构体的方法

    C++中同样拥有C语言中的结构体,下面就来详解C++程序中定义struct结构体的方法,需要的朋友可以参考下
    2016-05-05

最新评论