GCD求法

#include<stdio.h>
int gcd(int a,int b)
{
    return b==0 ? a: gcd(b,a%b);
}
在计算区间最大公约数(GCD)时,通常指的是在某个数值区间内找到两个或多个数的最大公约数。最大公约数(GCD)是能够同时整除这些数的最大整数。以下是几种常见的算法和方法,用于计算最大公约数: ### 欧几里得算法(辗转相除法) 欧几里得算法是一种经典的计算两个数的最大公约数的方法。其基本思想是:对于两个数 $ p $ 和 $ q $,如果 $ q = 0 $,则最大公约数是 $ p $;否则,用 $ p $ 除以 $ q $ 得到余数 $ r $,然后用 $ q $ 和 $ r $ 继续这个过程,直到余数为0。此时的除数即为最大公约数。 Java 实现代码如下: ```java public class EuclideanAlgorithm { public static int gcd(int p, int q) { while (q != 0) { int r = p % q; p = q; q = r; } return p; } public static void main(String[] args) { int a = 48, b = 18; System.out.println("GCD of " + a + " and " + b + " is " + gcd(a, b)); } } ``` ### 连续整数法 连续整数法是一种较为直观但效率较低的方法。其基本思想是从较小的数开始,逐个递减,直到找到一个能同时整除两个数的数。 Java 实现代码如下: ```java public class ConsecutiveIntegerGCD { public static int gcd(int x, int y) { int min = Math.min(x, y); while (x % min != 0 || y % min != 0) { min--; } return min; } public static void main(String[] args) { int a = 48, b = 18; System.out.println("GCD of " + a + " and " + b + " is " + gcd(a, b)); } } ``` ### 更相减损术 更相减损术是一种古老的算法,适用于任何需要最大公约数的场合。其基本思想是:用较大的数减去较小的数,然后用所得的差和较小的数继续这个过程,直到差和较小的数相等为止。 Java 实现代码如下: ```java public class SubtractionGCD { public static int gcd(int x, int y) { while (x != y) { if (x > y) { x -= y; } else { y -= x; } } return x; } public static void main(String[] args) { int a = 48, b = 18; System.out.println("GCD of " + a + " and " + b + " is " + gcd(a, b)); } } ``` ### Stein 算法(二进制 GCD 算法) Stein 算法是一种基于二进制运算的高效算法,特别适用于大整数的情况。其基本思想是利用位移和减法操作来替代传统的除法和取余操作,从而提高计算效率。 Java 实现代码如下: ```java public class SteinGCD { public static int gcd(int u, int v) { if (u == 0) return v; if (v == 0) return u; int shift; for (shift = 0; ((u | v) & 1) == 0; shift++) { u >>= 1; v >>= 1; } while ((u & 1) == 0) u >>= 1; do { while ((v & 1) == 0) v >>= 1; if (u > v) { int temp = u; u = v; v = temp; } v = v - u; } while (v != 0); return u << shift; } public static void main(String[] args) { int a = 48, b = 18; System.out.println("GCD of " + a + " and " + b + " is " + gcd(a, b)); } } ``` ### 区间最大公约数的应用 在实际应用中,区间最大公约数的概念可以扩展到多个数的情况。例如,在给定的区间内找到一组数的最大公约数,可以通过依次计算这些数的 GCD 来实现。具体来说,可以先计算前两个数的 GCD,然后将结果与第三个数计算 GCD,依此类推,直到所有数都被处理完毕。 Java 实现代码如下: ```java public class MultipleGCD { public static int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } public static int gcd(int[] numbers) { int result = numbers[0]; for (int i = 1; i < numbers.length; i++) { result = gcd(result, numbers[i]); } return result; } public static void main(String[] args) { int[] numbers = {48, 18, 30}; System.out.println("GCD of the array is " + gcd(numbers)); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值