C语言实现求最大公约数的三种方法

C语言实现求最大公约数的三种方法

最大公约数是指两个或多个整数共有约数中的最大值。下面我们将介绍 C 语言实现求最大公约数的三种方法。

1.辗转相减法

辗转相减法的基本思想是用大数减去小数,然后再用得出的差值去减小的数,这样一直操作,直到所减两数相等。 代码如下:

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

辗转相减法是一种很容易理解的方法,但是在 x 和 y 的数值非常大的时候,效率会比较低。

2. 乘除法

用较大数去除以较小数,再用除数去除余数,再用上一步的余数去除下一步的除数,如此反复直到余数为0为止,则最后的除数就是最大公约数。

代码如下:

int gcd(int x,int y) {
    int temp;
    while(x % y != 0) {
        temp = x % y;
        x = y;
        y = temp;
    }
    return y;
}

如果两个数中一个数很大,而另外一个数很小,那么这种方法比起上一种方法更加高效。

3. 更相减损术和移位相结合的方法

更相减损术和移位相结合的方法结合了辗转相减法和乘除法的优点。在每一轮循环中,我们需要将 x 和 y 分别进行移位操作,移位操作一共分为两种情况:

  1. 当 x 和 y 均为偶数时,将 x 和 y 同时右移直到它们变成奇数时停止,此时,我们将 t 记为移动的次数。

  2. 当 x 为奇数而 y 为偶数时,只对 y 进行右移操作,直到 y 为奇数时停止,此时我们重新回到第一种情况。

确定了移位次数 t 后,每次将 x 和 y 的绝对值进行减少,共减少 t 次。代码如下:

int gcd(int x,int y) {
    int factor = 1;
    while(x != 0 && y != 0) {
        if(x % 2 == 0 && y % 2 == 0) {
            x /= 2;
            y /= 2;
            factor *= 2;
        } else if(x % 2 == 0 && y % 2 == 1) {
            x /= 2;
        } else if(x % 2 == 1 && y % 2 == 0) {
            y /= 2;
        } else {
            if(x > y) {
                x -= y;
            } else {
                y -= x;
            }
        }
    }
    return x * factor;
}

这种方法可以在 x 和 y 均为大整数时,还能够得到较好的效果。我们来看个示例:

例如,对于 $x = 24$ 和 $y = 18$,我们来看一下三种方法的结果。

  • 用辗转相减法求得最大公约数为6
  • 用乘除法求得最大公约数为6
  • 用更相减损术和移位相结合的方法求得最大公约数为6

因此,这三种方法都可以有效地求出两个数的最大公约数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现求最大公约数的三种方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现程序开机自启动

    下面我为大家详细讲解如何使用C语言实现程序开机自启动的完整攻略。 1. 注册自启动 Windows 平台 在 Windows 平台上,我们需要在注册表中添加一项,来实现程序开机自启动。具体步骤如下: 打开注册表编辑器,定位到 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。 在 …

    C 2023年5月23日
    00
  • C++实现从数组中同时取出最大最小元素算法示例

    C++实现从数组中同时取出最大最小元素算法示例 算法思路 从数组中取最大最小值的算法是比较基础的一种算法,其实现思路也较为简单。本算法的实现思路如下: 定义一个变量来存储最大值,首先将其赋值为数组的第一个元素。 定义一个变量来存储最小值,首先将其赋值为数组的第一个元素。 遍历数组中的每一个元素,当找到一个比当前最大值还大的元素时,将最大值变量的值更新为该元素…

    C 2023年5月23日
    00
  • C语言WinSock学习笔记

    下面我来详细讲解一下《C语言WinSock学习笔记》的完整攻略。 一、WinSock是什么 WinSock (Windows Sockets) 是一种技术,允许应用程序通过 TCP/IP 协议来进行网络通信,是 Windows 操作系统自带的一个 API。WinSock 可以使用基于 TCP 或者 UDP 协议的 Socket 通信方式来实现网络应用。 二、…

    C 2023年5月22日
    00
  • C++ 中类对象类型的转化的实例详解

    C++ 中类对象类型的转化的实例详解 什么是类型转换? 类型转换是将数据从一种数据类型转换为另一种数据类型的过程。在 C++ 中,有几种类型转换的方式: 隐式类型转换:在表达式中,某些情况下,C++ 会自动将一种类型转换为另一种类型。例如,int x = 10; float y = x; 在将 int 类型赋值给 float 类型时,C++ 会自动完成数据类…

    C 2023年5月22日
    00
  • Python实现将json文件生成C语言的结构体的脚本分享

    下面为你提供 Python 实现将 json 文件生成 C 语言的结构体的脚本分享的完整攻略,具体步骤如下: 1. 安装必要的库 在使用过程中,需要使用 Python 的 json 模块和 os 模块,需要安装,可以使用下面的命令进行安装: pip install json pip install os 2. 读取 json 文件 使用 Python 的 j…

    C 2023年5月23日
    00
  • win10中0x40000015是什么错误? 0x40000015错误代码的解决办法

    Win10中0x40000015是什么错误?0x40000015错误代码的解决办法 在使用Windows 10时,有时会出现0x40000015错误代码,这是一种Windows操作系统的错误,通常与某些系统文件或设备驱动程序有关。在这篇文章中,将为您介绍0x40000015错误的含义以及解决办法。 错误含义 0x40000015错误指的是Windows操作系…

    C 2023年5月23日
    00
  • C语言中实现itoa函数的实例

    C语言中实现itoa函数的实例 什么是itoa函数? itoa函数是C++的标准库函数,可以将整型数据转换成对应的字符串。但在C中并没有该函数,为了方便C程序员的编程,我们需要自己实现该函数。 实现itoa函数的过程 实现itoa函数主要包括以下几个步骤: 判断待转换的整数是否为负数,如果是负数,则需要在最终的字符串前面添加负号。 将整型数按位分解,得到每个…

    C 2023年5月23日
    00
  • 基于Turbo C(V2.0)编译错误信息的详细介绍

    首先,我们需要了解Turbo C(V2.0)是一种针对DOS操作系统的C语言编译器。在使用过程中,由于各种原因可能会出现编译错误,需要及时查找并修复问题。 以下是详细介绍Turbo C(V2.0)编译错误信息的攻略: 1. 查看编译错误信息 在编译过程中,Turbo C会输出错误信息,包括错误类型、错误位置、错误描述等等。我们需要认真查看这些信息,需要特别关…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部