求最大公约数和最小公倍数的算法[通俗易懂]

求最大公约数和最小公倍数的算法[通俗易懂]在刷题的过程中,经常会遇到很多关于最小公倍数和最大公约数的问题。以下是用C语言写的求最大公约数和最小公倍数的算法。最大公约数。求最大公约数有三种算法。1、辗转相除法。   辗转相除法又称为欧几里德算法。这个方法大家已经都已经在数学上学过了。具体的步骤就是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是…

大家好,又见面了,我是你们的朋友全栈君。

在刷题的过程中,经常会遇到很多关于最小公倍数和最大公约数的问题。

以下是用C语言写的求最大公约数和最小公倍数的算法。

最大公约数。

求最大公约数有三种算法。

1、辗转相除法。

      辗转相除法又称为欧几里德算法。这个方法大家已经都已经在数学上学过了。具体的步骤就是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。举个例子就是:比如两个数字,x=453,y=36;

453%36=21;

36%21=15;

21%15=6;

15%6=3;

6%3=0;

%是取余符号,大家应该都知道吧。所以用这个算法可以求出453和36的最大公约数是3;

用C语言实现这个算法就是。

#include <stdio.h> 
int main()
{
	int a,b,c;
	scanf("%d%d",&a,&b);
	while(b)
	{
		c=a%b;
		a=b;
		b=c;
	}
	printf("%d\n",a);
	return 0;
}

或者是

#include <stdio.h> 
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	int a,b,c;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		c=gcd(a,b);
		printf("%d\n",c);
	}
	return 0;
}

2、更相减损法

       更相减损法是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。又名“更相减损术”,辗转相减法,等值算法,尼考曼彻斯法

比如说还是453和36;

453-36=417;

417-36=381;

381-363=345

.。。。。。。

9-6=3

6-3=3

3-3=0

然后3就是这两个数的最大公约数。

#include <stdio.h> 
int main()
{
	int a,b;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		while(a!=b)
		{
			if(a>b)
				a=a-b;
			else
				b=b-a;
			
		}
		printf("%d\n",a);
	}
	return 0;
}

 

3、穷举法

从1开始循环,一直循环到两个数中小的那个数。

#include <stdio.h> 
int main()
{
	int a,b,c;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		int max=1;       //记录最大公约数 
		c=a>b?b:a;      //c等于a和b中小的数 
		for(int i=1;i<=c;i++)
		{
			if(a%i==0&&b%i==0)
			{
				if(i>max)
					max=i;
			}
		}
		printf("%d\n",max);
	}
	return 0;
}

最小公倍数

求最小公倍数相对来说就比较简单了。只需要先求出最大公约数。用两个数的乘积除以最大公约数即可。

例如x和y的最小公倍数为x*y/gcd(x,y)。(gcd(x,y)表示为两个数的最大公约数)

#include <stdio.h> 
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	int a,b,c;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		c=a*b/gcd(a,b);
		printf("%d\n",c);
	}
	return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145244.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入解析 Java集合类ArrayList与Vector的区别

    深入解析 Java集合类ArrayList与Vector的区别集合类分为两个分支,Collection与Map,其中Collection接口继承了Iterator接口,继承Iterator接口的类可以使用迭代器遍历元素(即Collection接口的类都可以使用),今天我们从相同点、不同点、以及JDK源码等各个方面来深入解析下,底层使用数组实现的两个集合类:ArrayList与Vector的区别与联系区别与联系:1.ArrayList出现于jdk1…

    2022年5月20日
    33
  • clion2021激活码(注册激活)

    (clion2021激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZPB5EL5Q-eyJsaWNlbnNlSWQiOi…

    2022年3月20日
    85
  • resttemplate线程池(websocket connection to failed)

    项目场景:resttemplate调用HttpEntity产生报错传输过程问题描述:提示:这里描述项目中遇到的问题:例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据APP中接收数据代码:org.springframework.web.client.RestClientException:Couldnotwriterequest:nosuitableHttpMessageConverterfoundforrequesttype[[Lorg.a.

    2022年4月16日
    80
  • dos命令进入文件夹[通俗易懂]

    输入D:回车,进入D盘的根目录,然后输入dir回车可以查看根目录下的文件和文件夹,输入cd空格文件夹的名字(不区分大小写)进入文件夹根目录下,依次输入dir查看该目录下的文件和文件夹。   附录:MSDOS命令大全一、基础命令1dir无参数:查看当前所在目录的文件和文件夹。/s:查看当前目录已经其所有子目录的文件和文件夹。

    2022年4月14日
    274
  • SparkStreaming的介绍及原理

    SparkStreaming的介绍及原理一、SparkStreaming的介绍1.离线和流处理的区别1)离线处理是针对一个批次,这个批次一般情况下都比较大流处理对应的数据是连续不断产生,处理时间间隔非常短的数据2)离线处理程序,因为数据是有限的(bounded),所以会终止流数据因为是连续不断的产生,所以数据是无限的(unbounded)由于数据的特征,一般离线处理比较缓慢,流数据处理相对较快流处理:…

    2022年6月20日
    36
  • java.lang.Class类详解

    java.lang.Class类详解1.Class类与类的关系 Java程序运行时,系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。说白了,Class类对象就是封装了一个类的类型信息,可以通过该对象操作其对应的类,即发射机制。

    2022年5月29日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号