图形释化“辗转相除法”

做文背景:大一学的辗转相除法,可只知其用法(大数不断对小数取余,小数给大数,余数给小数,直到取小数为零后,最后一位被除数(大数)就是最大公约数),并没有真正有哪一次去问问自己为什么得这样做,最后导致想用却忘记怎么用,为此写下个人拙见供自己、大家参考。
设有两数:大数a、小数b以图形示下
在这里插入图片描述

它们都有公共的最大约数(Greatest Common Divisor(GCD))r
在这里插入图片描述

由于ab都是r的倍数,所以a还可以写成b+nra=b+nr
在这里插入图片描述

从上式a=b+nr可以得出a-b还是包含了我们的公约数r(a-b=nr还是r的倍数),换句话求ab两者的最大公约数可以转化求a-bb的公约数。

GCD(a, b) =》 GCD(a - b, b)
第二次 GCD(a - b, b) =》 GCD(a - 2b, b) …
第k次 GCD(a - (k-1)b, b) =》 GCD(a - kb, b)

直到最后不能再减b,也就是a%b的余数b1b来取最大公约数GCD(a%b, b)

以此推出求GCD(a, b)可以已转化求GCD(b,a % b)(换位保证参数一、二永远是大数在前,小数在后)

直到最后GCD(a, b)b 等于 0 ,最后最大公约数就是我们的a(注意ab是不断在变的)。
最后写出程序:

int GCD(int n, int m)
{
	//大数a 小数b
	if(b == 0) 							//余数为零结束,任何自然数与零取GCD任然是其本身 
		return a;
	else
		return GCD(b, a % b);			//当a小于b时a、b可换位
//	return b == 0 ? a : GCD(b, a % b);	//简化 
}

运行结果
在这里插入图片描述
在这里插入图片描述

只有知其然,往后想用也就不会烦于(我好像又忘了)。

重要文献链接: https://blog.csdn.net/weixin_45850035/article/details/114681895

数组辗转相除法通常指的是辗转相除法(也称欧几里得算法)在处理数组中的元素时的应用。这个算法主要用于计算两个正整数a和b的最大公约数(GCD)。基本思想是:两个正整数a和b(a>b),它们的最大公约数等于较小的数b和两数相除余数c的最大公约数。 在C++中,如果要对数组中的所有元素应用辗转相除法来找出它们的最大公约数,可以按照以下步骤操作: 1. 假设数组中的第一个元素是最大公约数。 2. 依次将数组中的下一个元素与当前已知的最大公约数进行辗转相除法计算,更新最大公约数。 3. 对数组中每个元素重复此过程,直到遍历完数组中的所有元素。 下面是使用C++实现数组中所有元素辗转相除法的一个示例代码: ```cpp #include <iostream> using namespace std; // 函数声明 int gcd(int a, int b); int findGCDofArray(int arr[], int n); int main() { int arr[] = {12, 18, 24, 30}; // 示例数组 int n = sizeof(arr)/sizeof(arr[0]); // 数组中元素的个数 cout << "数组元素的最大公约数是: " << findGCDofArray(arr, n) << endl; return 0; } // 辗转相除法计算两个整数的最大公约数 int gcd(int a, int b) { while (b != 0) { int c = a % b; a = b; b = c; } return a; } // 找出数组中所有元素的最大公约数 int findGCDofArray(int arr[], int n) { int result = arr[0]; for (int i = 1; i < n; i++) { result = gcd(result, arr[i]); if (result == 1) { // 如果最大公约数为1,则无需继续计算 return 1; } } return result; } ``` 上述代码中,`gcd`函数用于计算两个整数的最大公约数,`findGCDofArray`函数则用于找出数组中所有元素的最大公约数。在`main`函数中,我们创建了一个示例数组并调用`findGCDofArray`函数来计算并打印其元素的最大公约数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值