6.算法之数学(数论)算法——更相减损术

目录

1.什么是更相减损术?

2.数学推导

3.代码实现

4.最小公倍数计算


1.什么是更相减损术?

6.算法之数学(数论)算法——更相减损术_第1张图片

其使用方法如下

6.算法之数学(数论)算法——更相减损术_第2张图片

举个例子吧

6.算法之数学(数论)算法——更相减损术_第3张图片

可见更相减损术和辗转相除法有异曲同工之妙。

其数学原理也是一样的。

2.数学推导

6.算法之数学(数论)算法——更相减损术_第4张图片

 他是辗转相除法的一种特殊情况,下面我们用代码来实现它。

3.代码实现

#include//更相减损术 
int main()
{ 
	int a,b;
	printf("这个程序可以计算两个数的最大公约数!\n"); 
	printf("请输入两个数字,用空格隔开:\n") ;
	scanf("%d %d",&a,&b);
	while(a!=b)
	{
		if(a>b)//如果a不等于b,则大数减小数。 
		a-=b;
		else
		b-=a;
	}
	printf("您输入的两个数字的最大公因数为%d\n",b);
 } 

我们依然可以用递归函数:

#include//更相减损术 
int gcd(int m,int n)
{
	if(m==n) return n;
	else if(m>n) return gcd(n,m-n);
	else return gcd(m,n-m);
}
int main()
{ 
	int a,b;
	printf("这个程序可以计算两个数的最大公约数!\n"); 
	printf("请输入两个数字,用空格隔开:\n") ;
	scanf("%d %d",&a,&b);
	printf("您输入的两个数字的最大公因数为%d\n",gcd(a,b));
 } 

返回值根据二者大小会有区别。

4.最小公倍数计算

我们还可以顺理成章的计算最小公倍数

 根据数学关系可知,知道两个数和他们的最大公因数便可以求出最小公倍数了。

#include//更相减损术 
int main()
{ 
	int a,b,x,y;
	printf("这个程序可以计算两个数的最大公约数和最小公倍数!\n"); 
	printf("请输入两个数字,用空格隔开:\n") ;
	scanf("%d %d",&a,&b);
	x=a;y=b;
	while(a!=b)
	{
		if(a>b)//如果a不等于b,则大数减小数。 
		a-=b;
		else
		b-=a; 
	}
	printf("您输入的两个数字的最大公因数为%d\n",b);
	printf("您输入的两个数字的最小公倍数为%d\n",x*y/b); 
 } 

 我们同样可以对辗转相除法添加运算求得最小公倍数。

两者在数学上是同根同源的。

只不过一个体现了古代西方智慧,一个体现了古代中国智慧。

你可能感兴趣的:(算法,c++,开发语言)