辗转相除法

辗转相除法,也称为欧几里得算法,是一种用于求解两个整数的最大公约数的算法。它的基本思想是反复用较小数除较大数,然后用余数替换较大数,直到余数为零为止,此时的除数即为最大公约数。

具体步骤如下:
1. 将两个整数记为a和b(其中a >= b)。
2. 用b去除a,得到商q和余数r。
3. 若r等于0,则b即为最大公约数;若r不等于0,则将b赋值给a,将r赋值给b,然后返回第二步继续执行。
4. 最终得到的b即为最大公约数。

我也不废话给出辗转相除的函数:

int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

下面我给出它的其他写法:

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

还有python的写法:

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

还有java

import java.util.Scanner;

public class Main {
    public static int gcd(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter two numbers: ");
        int a = input.nextInt();
        int b = input.nextInt();
        int result = gcd(a, b);
        System.out.println("GCD of " + a + " and " + b + " is: " + result);
    }
}

当我们要计算两个整数a和b的最大公约数时,我们可以使用辗转相除法。

该算法基于以下观察:两个整数的最大公约数(GCD)等于其中较小数与两数相除的余数的最大公约数。

算法步骤如下:

1. 初始化变量a和b为输入的两个整数。
2. 在while循环中,不断执行以下操作,直到b等于0:
   - 创建一个临时变量temp,并将其赋值为b的值。
   - 计算a除以b的余数,并将结果赋值给b。
   - 将temp的值赋给a。
3. 当b等于0时,说明a能够整除b,此时a的值即为两个整数的最大公约数。
4. 返回a作为最大公约数。

让我们通过一个例子来说明这个算法的工作原理。假设a=12,b=8。

第一次循环:
- temp = 8,b = 12 % 8 = 4,a = 8。

第二次循环:
- temp = 4,b = 8 % 4 = 0,a = 4。

此时,b等于0,循环结束。最终的a值为4,因此12和8的最大公约数为4。

这个算法的优势在于每次迭代都会减小较大的数,直到余数为0。它是一种高效的求解最大公约数的方法,适用于任意两个整数。

下面我举个例子:

假设我们要求解两个整数的最大公约数,例如a = 48,b = 18。

1. 将较大的数作为被除数,较小的数作为除数:a = 48,b = 18。
2. 用18去除48,得到商2和余数12。
3. 因为余数12不等于0,所以将18赋值给a,将12赋值给b。
4. 重复第2步。用12去除18,得到商1和余数6。
5. 因为余数6不等于0,所以将12赋值给a,将6赋值给b。
6. 重复第2步。用6去除12,得到商2和余数0。
7. 因为余数0等于0,所以最大公约数为当前的除数,即6。

因此,48和18的最大公约数为6。 

java代码我单独解释下:

在上述代码中,我们定义了一个名为gcd的静态函数,它接收两个整数参数a和b,并返回它们的最大公约数。在主函数中,我们首先创建一个Scanner对象,从用户处读取两个整数a和b,并将它们传递给gcd函数进行计算。

gcd函数的实现与前面C++版本中所述的相同。具体而言,它使用while循环来迭代计算最大公约数,直到余数为0时停止。在每次循环中,我们通过临时变量temp来交换a和b的值,将a赋值为b,将b赋值为a除以b的余数。

最后,我们在主函数中打印输出结果,显示输入的两个整数的最大公约数。

你可能感兴趣的:(算法,c++,java,c语言,开发语言,笔记)