最大公约数 最小公倍数

Python求最大公约数和最小公倍数 大家好,我是Python领域的博主,如果觉得我的写的不错的话, 请点赞关注支持我一下。如果你是初学者,可以和小编一起学习,在这里我每天都会发Python的基础知识,以及相关的代码 解题思路: 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个;最小公倍数是指两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。最小公倍数=两整数的乘积÷最大公约数 , 所以怎么求最大公约数是关键。 求最大公约数: 辗转相除法是求最大公. 阅读详情

求解最大公约数和最小公倍数。

有两大种方法:求解最大公约数有欧几里德算法和stein算法。其中欧几里德算法又分为一般的和扩展的欧几里德算法。

而求解两数的最小公倍数则利用了它们的最大公约数,有公式lcm(a,b)=a*b/gcd(a,b)。lcm是最小公倍数的英文缩写,gcd同样。

所以求解最小公倍数的代码只在一般欧几里德算法分析中介绍下,读者可以举一反三。

 

一、欧几里德算法

1、一般欧几里德算法(只求最大公约数)

求最大公约数一个经典的方法就是辗转相除法了。以下将要介绍的代码也是利用其求解的。

其中,求解最大公约数用了递归和非递归两种方法,代码中有注释。  

 

代码如下:

#include<iostream>
using namespace std;

int gcd(int a,int b)  //a,b最大公约数,递归 
{
	if(b==0)
		return a;
	else
	    return gcd(b,a%b);
}

int GCD(int a,int b)   //a,b最大公约数,非递归 
{
    int tem;
    
    if(a<b)
    {
       tem=a;
       a=b;
       b=tem;
    }
    
    int rem=1;
    while(rem!=0)
    {
        rem=a%b;
        a=b;
        b=rem;
    }
    
    return a;
}

 
int lcm(int a,int b)  //最小公倍数 
{
    return a*b/gcd(a,b);
}

int main()
{
    int a,b,lc,gc1,gc2;
    
    cout<<"输入:"; 
    while(cin>>a>>b)
    {
       gc1=gcd(a,b);
       gc2=GCD(a,b);
       lc=lcm(a,b);
       
       cout<<"最大公约数:"<<gc1<<endl;
       cout<<"最大公约数:"<<gc2<<endl;
       cout<<"最小公倍数:"<<lc<<endl;
       cout<<endl;
       cout<<"输入:"; 
    }
    
    return 0;
}
 

         测试结果:

 再来啰嗦两句。求解最大公约数的非递归方法应该说很好理解,完全的辗转相除法。而递归方法则由于没有判断a,b的大小关系,很容易让人迷惑。

 比如,输入28   1274时,会有人觉得不能求解。其实,输入28   1274和输入1274   28是基本一样的。解释如下:输入28   1274,调用gcd(28,1274),

 b=1274,b!=0,所以执行return  gcd(b,a%b)也即return  gcd(1274,28)。因为28%1274=28!到此,已经和直接输入1274   28一样了。

2、扩展欧几里德算法(不仅仅可求出最大公约数,还可解出方程ax+by=gcd(a,b)中的x和y)

其详细描述及证明,请参考:点击打开链接

 

算法代码:

int extendGcd(int a,int b,int &x,int &y)   //扩展gcd,可以求出gcd(a,b)以及ax+by=gcd(a,b)中x,y的值
{
	if(b==0)
	{
		x=1;
		y=0;

		return a;
	}
	else
	{
		int a1=extendGcd(b,a%b,x,y);
		
		int tmp=x;
		x=y;
		y=tmp-a/b*y;

		return a1;
	}
}

 

二、Stein算法

Stein算法与欧几里德算法的不同是:Stein算法只有整数的移位与加减法,不需要进行除法和取模运算。

 

算法描述:

(1)判断a或b是否为0,若a=0,则b就是最小公倍数;若b=0,则a就是最小公倍数。算法结束。

(2)设a1=a,b1=b,c1=1。

(3)判断an、bn是否为偶数

①若都是偶数,则令a(n+1)=an/2,b(n+1)=bn/2,c(n+1)=2*cn。

②若an是偶数,则令a(n+1)=an/2,b(n+1)=bn,c(n+1)=cn。

③若bn是偶数,则令a(n+1)=an,b(n+1)=bn/2,c(n+1)=cn。

④若an、bn都是奇数,则令a(n+1)=|an-bn|,b(n+1)=min(an,bn),c(n+1)=cn。

(4)n累加1,跳转到(3)进行下一轮计算。

 

算法代码如下:

方法一:

int gcd(int a,int b)
{
	int min=(a>b)?b:a;
	int max=(a>b)?a:b;

	if(min==0)
		return max;
	if(max%2==0 && min%2==0)
		return 2*gcd(max/2,min/2);
	if(max%2==0)
		return gcd(max/2,min);
	if(min%2==0)
		return gcd(max,min/2);
	return gcd((max+min)/2,(max-min)/2);  //都是奇数,貌似和算法给出的不太一样,我测试了几组数据都是对的。。。
}


方法二:

int gcd(int a,int b)
{
	int min=(a>b)?b:a;
	int max=(a>b)?a:b;

	if(!min)
		return max;
	if(!max)
		return min;
	if(!(min&1) && !(max&1))  //都是偶数
		return gcd(min>>1,max>>1)<<1;
	if(!(min&1))      //小数为偶
		return gcd(min>>1,max);
	if(!(max&1))      //大数为偶
		return gcd(min,max>>1);

	//return gcd((max-min)>>1,min);  //都是奇数,不知道为啥这个也行???
    return gcd(max-min,min);  //都是奇数
}


 

 

 

 

 

用LabVIEW求最大公约数和最小公倍数 用LabVIEW求最大公约数和最小公倍数。可以自行选择数据。 立即下载

相关推荐

labview实例

将任意两个数a、b的最大公约数c和最小公倍数d显示在前面板(计算最大公约数和最小公倍数的时候必须以调用之前写好的子vi的形式)

求两个正整数的最大公约数

import java.util.Scanner; /** * Created with IntelliJ IDEA. * Description: * User: Wu Ruixi * Date:2019/10/17 * Time:21:21 **/ public class Work2_6 { // 求两个正整数的最大公约数 public static void ma...

qq_43149653的博客 261

最小公倍数 最大公约数_最小公倍数_最大公约数_

计算任意几个数的最小公倍数和最大公约数(简单方式\有子VI)

求最大公约数和最小公倍数

1.概念 最大公约数(Greatest Common Divisor:GCD)指某几个整数共有约数中最大的一个。最小公倍数(least common multiple:lcm)是某几个整数公有的倍数中最小的一个正整数。 2.相互之间关系及证明 两个整数的最小公倍数与最大公约数之间有如下的关系:最小公倍数 = 两数之积 / 最大公约数 证明1: 设a,b两个整数,假...

weixin_30920513的博客 321

从零搭建智能车竞赛卡丁车:自动驾驶科目中的锥桶识别与路径规划实战教程

本文提供了一份从零搭建智能车竞赛卡丁车的实战教程,重点解析了自动驾驶科目中的核心环节:锥桶识别与路径规划。内容涵盖硬件选型、传感器部署、基于单目视觉的识别算法,以及适用于嵌入式平台的轻量级路径规划与跟踪策略,旨在帮助参赛者与爱好者系统掌握关键技术,完成稳定可靠的自动驾驶系统搭建。

lg888的博客 1169

在overleaf中使用bibtex引用参考文献

最近在挑选写tex的平台,挑来挑去,个人感觉overleaf给我带来的体验感是最舒适的。不过由于对内部的文件组织和make进行了一层封装,所以与一般的本地平台编译tex会有一点不同。此处写一下在overleaf中使用bibtex的方法。 在tex中使用bibtex引用文献是一件很舒适的事,毕竟这是tex的优点之一(要是tex比word难用,我干什么不去用word,hhh) 第一步,我们创建一个.bib文件,名字随便起,我这边起为reference.bib。 然后打开谷歌学术,搜索你想要引用的文章,并找到

锦恢的博客 4万+

最大公约数和最小公倍数

#include using namespace std; int gcd(int x,int y) { int c; while(y!=0) { c=x%y; x=y; y=c; } return x; } int main() { int a,b,d; cin>>a>>b; for

as1246170471的专栏 332

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

求最小公倍数与最大公约数

最大公约数是指两个数相同因子总最大的那个,比如35和42,最大公倍数是7。要求最大公倍数,最常用的算法是辗转相除法,详见下面的代码; 最小公倍数是指两个数共有的倍数中最小的那个,比如35和42,最小公倍数是210,6和12,最小公倍数是12。两个数如果有最大公约数的话,他们的最小公倍数就是他们的乘积处以他们的最大公约数,如果没有最大公约数,那他们的最小公倍数就是他们的乘积。 #include

nyist327的专栏 1074

IC面试常考题 Verilog三分频电路设计(占空比50%,三分之一,三分之二)

实现三分频电路最简单的是: 利用计数器实现。 时序图分析(本人比较懒,平常科研忙,所以直接手画时序图了,懒得用软件画了): 直接上图分析:利用计数器每隔三个周期信号翻转一次,同时在不同的计数下翻转得到的同步信号 clk_1和clk_2,再利用异或即可实现出一个不同占空比的三分频信号(同样的方法也可扩展到其他奇数分频设计中)。 例如占空比50%: module Div_three( input clk, input rst_n, output div_three ); reg

qq_41884662的博客 1万+

淘晶驰串口屏自定义协议实战:5分钟搞定苹果时钟通信(附完整代码)

本文详细介绍了如何使用淘晶驰串口屏自定义通信协议快速实现苹果风格时钟的通信功能。通过精简的协议设计和完整的代码示例,开发者可以在5分钟内完成从硬件连接到软件实现的整个过程,适用于嵌入式开发中的高效通信需求。

weixin_29184371的博客 323

C语言—最大公约数和最小公倍数

如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。最大公约数就是最大的约数。公倍数是指在两个或两个以上的 自然数 中,如果它们有相同的 倍数 ,这些倍数就是它们的公倍数。公倍数中最小的,就称为这些 整数 的 最小公倍数。

做梦都想要三十万年薪~ 3159

手把手教你用Ubuntu Desktop搭建个人L2TP服务器,手机电脑都能连(Network Manager配置详解)

本文详细介绍了在Ubuntu Desktop上使用Network Manager图形化配置L2TP服务器的方法,实现手机、电脑等多设备安全连接。从环境准备、图形界面设置到各平台客户端配置,提供一站式解决方案,并包含常见问题排查与安全增强措施,帮助用户快速搭建个人远程访问网络。

weixin_30555125的博客 121

最大公约数与最小公倍数的详细讲解及求法

最大公约数的基本概念 能够整除一个整数的整数称为其的约数(如5是10约数);能够被一个整数整除的整数称为其的倍数(如10是5的倍数);如果一个数既是数A的约数,又是数B的约数,称为A,B的公约数,A,B的公约数中最大的一个(可以包括AB自身)称为AB的最大公约数。 辗转相除法求最大公约数 辗转相除法的基本做法 用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数 in

sjp11的博客 3万+

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

Java—最小公倍数和最大公约数

Java—最小公倍数和最大公约数 Description 从键盘输入两个正整数,求这两个正整数的最小公倍数和最大公约数,并输出。 Input 输入包括一行。 两个以空格分开的正整数。 Output 两个整数的最小公倍数和最大公约数。 Sample Input 6 8 Output 24 2 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-gener

qq_45885219的博客 4541

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java最大公约数与最小公倍数

public class _01_最大公约数与最小公倍数 { public static void main(String[] args) { System.out.println("请输入第一个正整数:"); Scanner sc = new Scanner(System.in); int m = sc.nextInt(); ...

Superman_peng的博客 1308

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

求解最大公约数以及最小公倍数

  最大公约数和最小公倍数求解,常用的方法是短除法进行因式分解,然后最大公约数是所有公共因子的乘积,最小公倍数是所有因子的乘积。 本质上求最小公倍数就是求最大公倍数:x=ma, y=mb;m是最大公约数,那最小公倍数就是mab。所以可以得到最大公约数与最小公倍数的关系: LCM(A,B)×GCD(A,B)=A×B 其中LCM是最小公倍数,GCD是最大公约数 来源:https://blog.cs...

1724

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最大公约数与最小公倍数

在前面的课程中,我们已经学习了 Python 的基本输入输出、数据类型及其转换、顺序结构、分支结构、循环结构、循环控制语句、字符串类型、列表类型、元组类型、字典类型、集合类型、函数的定义与使用、函数调用与作用域以及函数的高级应用。通过本课时的学习,你已经掌握了 Python 中的最大公约数和最小公倍数的概念,并通过具体的示例展示了如何计算两个数的最大公约数和最小公倍数。例如,12和18的最大公约数是6。现在我们通过一个综合示例来展示如何计算两个数的最大公约数和最小公倍数,并将这两个功能封装在一个主程序中。

qq_57335683的博客 946

python计算最大公约数和最小公倍数_python怎么求最大公约数和最小公倍数

详细内容python怎么求最大公约数和最小公倍数一、求最大公约数用辗转相除法求最大公约数的算法如下:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数。具体代码如下:def gongyue(a, b):"""欧几里得算法----辗转相除法:param a: 第一个数...

weixin_30486717的博客 5083
上一篇: 函数 运算符 重载
下一篇: 指针浅谈
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值