首页 > 编程语言 >求最大公约数的三种算法

求最大公约数的三种算法

时间:2024-09-25 22:22:15浏览次数:3  
标签:return factors int 复杂度 min 算法 最大公约数 三种

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; 
  
int gcdByBruteForce(int a, int b) {  
    for (int i = min(a, b); i > 0; --i) {  
        if (a % i == 0 && b % i == 0) {  
            return i;  
        }  
    }  
    return 1; 
}  

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

void prime_factors(int n,vector<int>& factors) {
    for (int i = 2; i * i <= n; i++) {
        while (n % i == 0) {
            factors.push_back(i);
            n /= i;
        }
    }
    if (n > 1) {
        factors.push_back(n);
    }
}

int gcd(int a, int b) {
    vector<int> factors_a, factors_b;
    prime_factors(a, factors_a);
    prime_factors(b, factors_b);

    for (int factor : factors_a) {
        if (find(factors_b.begin(), factors_b.end(), factor) != factors_b.end()) {
            return factor;
        }
    }
    return 1;
}

int main(){
	int m,n;  
   	cin>>m>>n;
   	cout<<gcdByBruteForce(m,n)<<"\n";
   	cout<<gcdByEuclidean(m,n)<<"\n";
   	cout<<gcd(m,n)<<"\n";
    return 0;   
}
  1. gcdByBruteForce(int a, int b):这个函数通过暴力枚举的方式寻找两个数的最大公约数。最坏情况下,时间复杂度为O(min(a, b)),因为需要遍历从1到min(a, b)的所有整数,检查它们是否同时是a和b的因子。

  2. gcdByEuclidean(int a, int b):这个函数使用辗转相除法(欧几里得算法)来计算最大公约数。在最坏情况下,时间复杂度为O(log(min(a, b))),因为每次迭代都会将其中一个数减小至少一半,直到其中一个数变为0。

  3. gcd(int a, int b):这个函数首先计算两个数的质因数分解,然后找出它们的公共质因数作为最大公约数。质因数分解的时间复杂度取决于输入数字的大小,但对于较小的数字,通常可以在O(sqrt(n))的时间内完成。在最坏情况下,如果两个数都有大量的质因数,那么时间复杂度可能接近O(n),其中n是输入数字的大小。然而,对于大多数实际应用,我们可以认为质因数的数量是有限的,因此这个函数的时间复杂度可以近似为O(sqrt(a) + sqrt(b))。

标签:return,factors,int,复杂度,min,算法,最大公约数,三种
From: https://blog.csdn.net/m0_73096516/article/details/142470045

相关文章

  • 矿山井下/传送带堆料检测AI算法的检测作用、工作原理及其解决方案
    传送带堆料分为两种情况,一种是传送带的井下堆料检测AI算法,一种是传送带上面的堆料检测AI算法,传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪,通过视频分析检测井下堆煤情况,当洒煤堆积到一定程度后,智慧矿山版ai盒子自动产生报警,并语音通知值班人员,也可通过前端音箱......
  • 代码中的大数定律:蒙特卡洛算法逼近圆周率π
    摘要:当程序员遇上π,蒙特卡洛算法成了他们的魔法棒。本文用一段C语言代码,将随机点的雨滴洒向数字的海洋,用概率的网捕捉π的踪迹。这不仅是一场算法的探险,更是对编程魔法的一次奇妙展示。认识蒙特卡洛算法蒙特卡洛算法是一类基于概率的算法的统称,不是特指某一种算法。它也被称为统计......
  • 10.解析解方法推导线性回归——不容小觑的线性回归算法
    引言线性回归是许多复杂机器学习模型的基础。作为一种基本的机器学习方法,线性回归提供了清晰的思路和工具,通过理解其推导过程,可以更好地掌握机器学习的基本原理和模型设计。通过阅读本篇博客,你可以:1.学会如何用解析解的方法推导线性回归的最优解2.了解如何判定损失函数是凸......
  • 较快速的最大带权独立集算法
    前言重新来吧别输在过去最得意的事上。只是单纯的记录一下这个小知识点。很多时候,题目可以转化为求最大带权最小点覆盖或者是最大独立集。但是他又经常把这个范围给到\(n\le40\)这种看上去可以用指数又不太能用指数的情况。可能这个时候你就需要用到短小精悍的它。基......
  • 信息安全工程师(18)常见密码算法
    前言  常见的密码算法主要分为三大类:对称加密算法、非对称加密算法和摘要算法。一、对称加密算法    对称加密算法,又称为秘密密钥算法或单密钥算法,是指加密和解密使用相同密钥的加密方式。这种算法的特点是加密速度快,适用于大量数据的加密。常见算法:AES(Ad......
  • 编码探索:卡布列克常数的算法之旅
    数字的魔法:给我任意一个四位数,通过排列和减法,最终总能得到6174——卡布列克常数。本文用代码演示了这一神奇过程,带你领略数学的奇妙和编程的乐趣。卡布列克常数(Kablekconstant):任意一个不是由完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的......
  • IP地址解析(算法题)
    例题讲解:例题1:IP地址解析(拼多多面试题)给定一个字符串表示的IP地址,如“123.92.2.34”,判断其是否合法。合法IP地址的规则如下:a.除了空格、数字和.之外,不得包含其他字符。b.IP地址由四个数字构成,由.分隔,每个,隔开的数字大小在0~255之间。c.数字前后可以有空格,但中间不能......
  • 滑动窗口算法以及应用
    滑动窗口算法以及应用主要涉及以下几个关键参数和概念:窗口大小(WindowSize):这是滑动窗口的宽度,决定了窗口中包含的数据点数量。例如,如果你在处理时间序列数据,窗口大小可能定义为秒、分钟或小时的数量。窗口位置(WindowPosition):由左右边界(通常是两个指针)定义的窗口在数据序列......
  • 滑动窗口算法以及应用
    主要涉及以下几个关键参数和概念:窗口大小(WindowSize):这是滑动窗口的宽度,决定了窗口中包含的数据点数量。例如,如果你在处理时间序列数据,窗口大小可能定义为秒、分钟或小时的数量。窗口位置(WindowPosition):由左右边界(通常是两个指针)定义的窗口在数据序列中的当前位置。左指针标志着窗......
  • 算法设计与分析(数字塔问题
    目录题目——动态规划求解数字塔问题问题描述代码实现输出结果注意事项小结:题目——动态规划求解数字塔问题在这篇博客中,我们将探讨一个经典的动态规划问题:在一个金字塔形状的数字矩阵中,如何找到从顶部到底部的最大路径和。每次只能向下移动到相邻的数字,最终我们需要计算出这一最......