c语言求最大公约数与最小公倍数

236 阅读1分钟

1、数学求解最大公约数与最小公倍数的方法---分解质因式法

1.1 原理

最大公约数:两个数共有的约数中最大的一个。 假设两个数A,B。他们的公约数t的范围1<t<=Min(A,B) 最小公倍数:两个数公有的最小倍数。 在这里插入图片描述

一直除下去,直到A和B这两个数,没有共同的除数之后,左边R之间的乘积就是最大公约数,即RR1。 最小公倍数就是RR1A2B2。

1.2 编码流程

1、我们写一个循环判断程序,循环终止条件是A和B中的最小值。判断A和B的共同约数最大为多少。

printf("please input\n");
	scanf("%d%d",&m,&n);  //输入要求公约数与公倍数的两个数m,n
	if(m<n)
		t=m;         //判断m,n中的最小值,把它赋值给t;
	else
		t=n;
	
for(i=1;i<=t;i++)
	{
		if(m%i||n%i)      //m和n余数只要有一个不为零,就结束这次循环,进入下一次循环
		{
			continue;
		}
		else              //m和n都为零时,更新公约数变量
		{
			r=i;
		}
	}

循环结束之后,r中存放的就是m和n中最大的公约数。 2、求最小公倍数,就是先求出谁乘以最大公约数各自等于m和n,把求出各个数字乘起来,再乘以最大公约数就是最小公倍数。

y=r*(m/r)*(n/r)*r;

1.3 完整代码如下:

#include<stdio.h>
int main()
{
	int m ,n,y,r,i,t;
	printf("please input\n");
	scanf("%d%d",&m,&n);
	if(m<n)
		t=m;
	else
		t=n;
	
	for(i=1;i<=t;i++)
	{
		if(m%i||n%i)
		{
			continue;
		}
		else
		{
			r=i;
		}
	}
	y=r*(m/r)*(n/r)*r;
	printf("max %d\n",r);
	printf("min %d\n",y);
	return 0;
 } 

2、数学求解最大公约数与最小公倍数的方法---辗转相除法

2.1原理

假设求m,n中最大公约数,用m除以n,把它的余数和被除数中最大的赋值给m,小的赋值给n,继续相除,直到最后的余数为零位置,这个时候在除数位置上的数就是最大公约数。 如:求(319,377): 第一步: 377÷319=1(余58) 第二步:319÷58=5(余29) 第三步:58÷29=2(余0) 29就是m和n 的最大公约数。

2.2编程步骤

先记录下m,n的乘积,因为求最小公倍数时,需要用到公式:两个数的乘积等于这两个数的最大公约数与最小公倍数的积。

p=n*m;

然后用辗转相除法求出最大公约数。

if(n<m)
	{
		temp=n;
		n=m;
		m=temp;
	}
	p=n*m;
	while(m!=0)
	{
		r=n%m;
		n=m;
		m=r;
		if(n<m)
		{
			temp=n;
			n=m;
			m=temp;
		}
	}

然后代入公式,求出最小公倍数

p/n

2.3 完整代码

#include<stdio.h>
int main()
{
	int p,r,n,m,temp;
	printf("请输入两个正整数:n,m:");
	scanf("%d%d",&n,&m);
	if(n<m)
	{
		temp=n;
		n=m;
		m=temp;
	}
	p=n*m;
	while(m!=0)
	{
		r=n%m;
		n=m;
		m=r;
		if(n<m)
		{
			temp=n;
			n=m;
			m=temp;
		}
	}
	printf("它们的最大公约数为:%d\n",n);
	printf("他们的最小公倍数为:%d\n",p/n);
	return 0;
 }