分别使用【循环结构】和【递归函数】求——两个整数的最大公约数和最小公倍数


程序参考《高质量程序设计指南——C++/C语言》 ,好书推荐


一、最大公约数(英语:Greatest Commom Divisor,gcd),指能够整除多个整数的最大正整数

而多个整数不能都为零,例如【8和12】的最大公约数为4。

辗转相除法(来自维基百科)

相比素因数分解法,辗转相除法的效率更高。计算 gcd(18,48) 时:

  1. 先将48除以18得到2、余数12
  2. 然后再将18除以12得到商1、余数6
  3. 再将12除以6得到商2、余数0,即得到最大公因数6。

我们只关心每次除法的余数是否为0,为0即表示得到答案。这一算法更正式的描述是这样的:

{\displaystyle \gcd(a,0)=a}

{\displaystyle \gcd(a,b)=\gcd(b,a\,\mathrm {mod} \,b)}

其中

{\displaystyle a\,\mathrm {mod} \,b=a-b\left\lfloor {a \over b}\right\rfloor }

如果参数都大于0,那么该算法可以写成更简单的形式:

{\displaystyle \gcd(a,a)=a},

{\displaystyle \gcd(a,b)=\gcd(a-b,b)\quad } 如果 a > b

{\displaystyle \gcd(a,b)=\gcd(a,b-a)\quad } 如果 b > a

 二、最小公倍数(Least Commom Multiple)

两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。

  • 8=2*2*2   12 = 2*2*3
  • 所以最小公倍数 = 2*2*2*3(把两者分解的都乘进去)
  • 8和12的最小公倍数就是 24

注:最小公倍数 = 【8*12】除以【8和12的最大公约数】   8*12/4 = 8*3 = 24

三、递归求解

#include<stdio.h>
//求两个整数a和b的最大公约数
unsigned long gcd_2(unsigned long a,unsigned long b)
{
	if(b==0){
		return a;
	}else{
		return gcd_2(b,a%b);
	}
} 

int main(void){
	unsigned long a,b;		//两个整数
	unsigned long lcm=0;	//最小公倍数
	unsigned long gcd=0;	//最大公约数 
	while(1){
		printf("Please input two positive integers(spacebar as separator):");
		scanf("%lu %lu",&a,&b);
		if(a<=0 || b<=0){
			printf("Input Error!\n");
			continue;
		}else{
			break;
		}
	} 
	gcd = gcd_2(a,b);
	lcm = (a*b)/gcd;
	printf("Their Greatest Commom Divisor is %lu.\n",gcd);
	printf("Their Least Commom Multiple is %lu.\n",lcm);
	return 0;
}

四、循环结构求解

  • 求最大公约数可用辗转相除法
  • 最小公倍数就是两个整数的乘积除以其最大公约数
#include<stdio.h>
int main(void){
	unsigned long a,b,c=0;	
	unsigned long lcm=0;	//最小公倍数
	unsigned long gcd=0;	//最大公约数 
	while(1){
		printf("Please input two positive integers(spacebar as separator):");
		scanf("%lu %lu",&a,&b);
		if(a<=0 || b<=0){
			printf("Input Error!\n");
			continue;
		}else{
			break;
		}
	} 
	unsigned long ra = a, rb = b;	//保存原始数据
	
	//辗转相除法
	while(a%b !=0){
		c = a%b;
		a = b;
		b = c;
	} 
	gcd = b;
	lcm = (ra*rb)/gcd;
	printf("Their Greatest Commom Divisor is %lu.\n",gcd);
	printf("Their Least Commom Multiple is %lu.\n",lcm);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39883358/article/details/86743775