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

yizhihongxing

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日

相关文章

  • go类型转换及与C的类型转换方式

    下面是有关Go类型转换和与C语言的类型转换方式的完整攻略。 Go类型转换 在Go语言中,类型转换是将一个数据类型的值转换成另一个数据类型的值。类型转换的语法为:T(x),其中 T 表示需要转换的类型, (x) 表示需要转换的值。例如: var a uint8 = 10 var b uint16 = uint16(a) 当需要将 a 转换为 uint16 类型…

    C 2023年5月23日
    00
  • C语言中如何进行内存管理?

    C语言中内存管理主要分为两种:静态分配和动态分配。 静态分配:在程序编译阶段就分配好内存,变量在整个程序运行期间都存在,并且内存地址不会改变。静态分配可以通过以下几种方式实现: 局部静态变量:在函数中声明,但变量的存储空间在程序执行期间都存在,且只会被初始化一次。例如: void func() { static int count = 0; count++;…

    C 2023年4月27日
    00
  • C语言实现的程序员老黄历实例

    针对“C语言实现的程序员老黄历实例”,如果你想要实现这个小项目,可以按照以下步骤进行操作。 步骤一:确定项目目录并初始化 首先,在你的终端或者命令行中,切换到你要创建这个项目的目录下,比如 C:/Users/your_name/Desktop/programer_calender。 在该目录下执行以下命令初始化项目 mkdir calender cd cal…

    C 2023年5月23日
    00
  • js中的json对象详细介绍

    下面我就来为你讲解一下“JS中的JSON对象详细介绍”的完整攻略。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,由Douglas Crockford在2001年提出。 JSON格式具有以下特点: 语法非常简单,易于阅读和编写。 可以表示简单的和复杂的数据…

    C 2023年5月23日
    00
  • Python的Bottle框架中返回静态文件和JSON对象的方法

    Python的Bottle框架是一个轻量级的Web框架,它提供了Web开发的核心功能,如路由、请求、响应等功能。Bottle框架还提供了返回静态文件和JSON对象的方法,下面我们就来详细讲解一下。 返回静态文件 在Bottle框架中,可以使用static_file函数来返回静态文件。该函数的原型如下: def static_file(filename, ro…

    C 2023年5月23日
    00
  • 解决易语言转换到C++ 自定义数据类型

    解决易语言转换到C++ 自定义数据类型 背景 易语言是一种高级编程语言,用户可以使用易语言编程进行二次开发。但是,在某些情况下,用户可能需要将易语言代码转换成C++代码以便更好地运行和使用。 在将易语言代码转换成C++代码时,对于易语言中的自定义数据类型的处理需要格外注意和谨慎。因为C++中的自定义数据类型对应于易语言中的自定义类型,并且两者的内部结构和使用…

    C 2023年5月23日
    00
  • C语言实现520表白代码 祝你表白成功!

    C语言实现520表白代码攻略 感谢您对C语言表白代码的关注。下面是实现520表白代码的完整攻略。 1. 准备工作 在开始实现520表白代码之前,需要安装C语言编译器。在Windows系统上,我们建议使用MinGW或者Visual Studio Code(带有C/C++扩展)作为编译器;在Linux系统上,可以使用GCC。 2. 编写C程序 我们可以通过在C程…

    C 2023年5月23日
    00
  • C语言围圈报数题目代码实现

    我先来介绍一下 “C语言围圈报数题目代码实现” 是什么: 这是一道经典的数学题目,题目有三个人围成一圈,他们报数,规定报到第三个人的时候要翻过去,也就是从头开始,如此循环,直到只剩下最后一个人。现在我们需要用C语言实现这个过程。 下面是该算法的完整实现,以及代码解析: 思路分析 1.将所有人简化为一个数组,数组的下标表示的是人的编号。2.从第k个人开始循环报…

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