首页 > 其他分享 >最大公约数与最小公倍数

最大公约数与最小公倍数

时间:2024-09-21 15:52:26浏览次数:5  
标签:return gcd 公倍数 辗转 最小 int 最大公约数

前言:

   最大公约数(最大公因数)是指两个或多个整数共有约数中最大的一个。最小公倍数是指两个或多个整数的公倍数里最小的那一个。最大公约数记为(a,b),最小公倍数是已知几个数的公倍数,且是最小的那一个。

1.法一:辗转相除法 

#include<stdio.h>
int main ()
{
    int a,b; 
    int r = 0;
    int l = 0;//初始化 
    scanf("%d %d",&a,&b);
    l =a*b;//由定理可知 ,提前存下两数乘积 
    //辗转相除 
    do
    {
    	r=a%b;
    	a=b;
    	b=r;
	}while(b); 
    printf("最大公约数为:%d\n",a);
    printf("最小公倍数为:%d\n",l/a);
    return 0;
}

下面我来逐步讲解 辗转相除法

  首先我们要知道,公约数是两数共同的因子,比如2是4和6的因子,12是36和48的因子。最大公约数就是两数最大的因子。知道了这点,结合公式就很容易求出来了,许多初学者忘记概念才觉得很难懂。

  辗转相除法的基本原理可描述如下:若b是0,则最大公约数是a中的值;否则计算a除以b的余数r,把b保存到a中,并把余数r保存到b中,重复上述过程,直到b为0,a中的数即为最大公约数。

   使用循环结构,根据步骤依次写入循环,当b为0时退出循环。

需要注意的点就是:两个自然数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积。

之所以我们需要提前保存两数乘积,是因为经过循环后,a、b的值被改变

2.法二:穷举法(暴力法)

#include <stdio.h>

int gcd(int a, int b) {
    int max_gcd = 1;
    for (int i = 1; i <= a && i <= b; i++) 
	{
        if (a % i == 0 && b % i == 0) {
            max_gcd = i;//越往后i越大,所以不用比较 
        }
    }
    return max_gcd;
}

int main() {
    int num1, num2;
    printf("输入两数: ");
    scanf("%d %d", &num1, &num2);
    printf("最大公约数为: %d\n", gcd(num1, num2));
    return 0;
}

使用循环结构依次判断,效率较辗转相除法慢,适用于小整数。

3.法三:递归的更相减损法

递归是一种编程技巧,它允许一个函数直接或间接地调用自己。在求解最大公约数的问题中,递归方法的核心思想是将问题分解为更小的子问题

更相减损术是一种古老的算法,用于计算两个正整数的最大公约数。其原理是重复从较大的数中减去较小的数,直到其中一个数变为零。当其中一个数变为零时,另一个数即为最大公约数。(辗转法中也有类似思想)

递归实现的更相减损术如下:

#include <stdio.h>
int gcd(int a, int b) {
    if (b == 0) 
	{
        return a;
    } 
	else 
	{
        return gcd(b, a % b);
    }
}

int main() 
{
    int num1, num2;
    printf("输入两数 ");
    scanf("%d %d", &num1, &num2);
    printf("最大公约数为: %d\n", gcd(num1, num2));
    return 0;
}

在这个递归函数中,如果 b 等于零,函数就返回 a,因为任何数和零的最大公约数都是它本身。如果 b 不等于零,函数就递归调用自己,这次的参数是 ba % b

4.法四:Stein算法(二进制GCD)

这个方法是网络归纳的,提供了不同的视角和方法,可供大家思考。

#include <stdio.h>

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    int k;
    for (k = 0; ((a | b) & 1) == 0; k++) {
        a >>= 1;
        b >>= 1;
    }
    while ((a & 1) == 0)
        a >>= 1;
    do {
        while ((b & 1) == 0)
            b >>= 1;
        if (a > b) {
            int temp = a;
            a = b;
            b = temp;
        }
        b = b - a;
    } while (b != 0);
    return a << k;
}

int main() {
    int num1, num2;
    printf("Enter two numbers: ");
    scanf("%d %d", &num1, &num2);
    printf("The GCD of %d and %d is %d\n", num1, num2, gcd(num1, num2));
    return 0;
}

标签:return,gcd,公倍数,辗转,最小,int,最大公约数
From: https://blog.csdn.net/2401_83779763/article/details/142415114

相关文章

  • 代码随想录算法训练营第一天 | 209. 长度最小的子数组 59. 螺旋矩阵 58. 区间和 Java
    209.长度最小的子数组题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/description/解题思路思路1:暴力解法通过两个for循环,找出所有的可能的区间,并比较出最小区间思路2:滑动窗口因为需要找出的是连续的一个子数组,所以可以模拟一个从左到右滑动的一个......
  • 基于平均加权最小二乘法AWTLS、加权最小二乘 WLS、总最小二乘法TLS以及加权总最小二乘
         ......
  • 最小圆覆盖(html)
    最小圆覆盖问题是什么呢?就是指在二维平面上有一堆点,然后我们要求一个最小半径的圆能够将所有点全部都包住,这就是最小圆覆盖问题。最小覆盖圆的性质性质1:最小覆盖圆是唯一的证明:我们假设有两个圆O1,O2,他们半径都是r,都是最小覆盖圆,那么所有的点一定在两圆的交集部分。那我们以两......
  • 最小点覆盖问题
    E.AlgebraFlash做这道题的时候新学的算法,叫做最小点覆盖.令\(c_i\)为在\(i\)位置的颜色首先了解题意,由于我们只能跨\(1\)~\(2\)步,故此时如果有\(c_i=c_{i+1}\),则\(c_i\)这个颜色是必选的,若两者不相等,也必须从两者里面选择出一个来,那么我们可以给相......
  • 【高中数学/等比数列/基本不等式】已知正项等比数列{an}满足a_4^2=a_m*a_n,则9/m+1/n
    【问题】(甘肃高台县第一中学某年模拟测试(文))已知正项等比数列{an}满足a_4^2=a_m*a_n,则9/m+1/n的最小值为?【出处】《高考数学极致解题大招》P119典例16中原教研工作室编著【解答】a_4=aq^3a_4^2=a^2*q^6a_m=aq^m-1a_n=aq^n-1因为a_4^2=a_m*a_n,所以q^6=q^m+n-2,即m+n=89/m+1/n=9/m*......
  • 最小二乘解的理解
    记录一下工作时遇到的拟合问题,将两个数据的关系建模为最小二乘的模型:\[y=a_0+a_1x+a_2x^2+a_3x^3+a_4x^4\]使用了python里面的numpy.linalg.lstsq函数进行拟合,以下是一个简单的示例importnumpyasnpimportmatplotlib.pyplotasplt#样本数据点x=np.a......
  • 【高中数学/等比中项/极值/基本不等式】已知a>0,b>0,9是3^a与27^b的等比中项,求:(a^2+2)
    【问题】(某地模考题)已知a>0,b>0,9是3^a与27^b的等比中项,求:(a^2+2)/a+(3b^2+1)/b的最小值?【解答】由”9是3^a与27^b的等比中项“得到3^a/9=9/27^b,继而得到a+3b=4......(1)(a^2+2)/a+(3b^2+1)/b=a+2/a+3b+1/b=4+2/a+1/b......(2)由(1)得出2=a/2+3b/2,1=a/4+3b/4代入(2)得4+1/2+3b/2a+a......
  • 【高中数学/极值/基本不等式】已知正数a,b满足a+4b+2ab=6,则a+4b的最小值为?
    【问题】(山西师范大学实验中学高二阶段练习)已知正数a,b满足a+4b+2ab=6,则a+4b的最小值为?【出处】《高考数学极致解题大招》P102变式训练1中原教研工作室编著【解答】由a+4b+2ab=6得到(a+2)(2b+1)=8而a+4b=(a+2)+2(2b+1)-4>=2*根号下((a+2)*2*(2b+1))-4=2*4-4=4所以a+4b的最小值为4【......
  • [Python手撕]最小覆盖子串
    classSolution:defminWindow(self,s:str,t:str)->str:defjudge(map_p,map_q):forkey,valueinmap_q.items():ifmap_p.get(key,0)<value:returnFalsereturnTrue......
  • 代码随想录算法训练营二天|209. 长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土
    209.长度最小的子数组太久没做题初始思路只能想到暴力破解,看了一眼提示可能会用到前缀和,能够想到只要建立一个新数组,bi=a0+a1+...+ai即数组a的前缀,这样子序列i到j就可以表示为bj-bi-1,由于数组元素是大于1的,所以b数组必然是递增的,那么在计算子序列的时候,当符合条......