《几何原本》命题I.12

《几何原本》命题I.12

经过直线外的一点可以向直线作垂线。
在这里插入图片描述
AAA 是给定点
AAA 为圆心,以任意半径作圆,与直线交于 B,CB,CB,C
BCBCBC 的中点 DDD,连结 ADADAD
∵AD=AD,BD=CD,AB=AC\because AD=AD,BD=CD,AB=ACAD=AD,BD=CD,AB=AC
∴△ABD≅△ACD\therefore\triangle ABD\cong\triangle ACDABDACD
∴∠BDA=∠CDA=90∘\therefore\angle BDA=\angle CDA=90^{\circ}BDA=CDA=90

Description 辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。 两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252105的最大公约数是21252 = 21 × 12105 = 21 × 5);因为252105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。 例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147:     1071 = 2 × 462 + 147. 然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21:     462 = 3 × 147 + 21. 再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数:     147 = 7 × 21 + 0. 此时,余数是0,所以1071和462的最大公约数是21。 Input 输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。 Output 每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。 从整除定义出发:若a整除b(b除以a没有余数),则b是a的倍数,a是b的约数,这里要求b不为0。因此0是任意整数的倍数(任意整数都是0的约数),但是0不能是约数。 Sample Input 1 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36 Sample Output 1 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72
06-07
### 辗转相除法(欧几里得算法)实现最大公约数和最小公倍数 辗转相除法是一种古老的算法,用于求解两个整数的最大公约数。其核心思想是:两个整数的最大公约数等于其中较小的数和两数之差的最大公约数[^1]。进一步简化后,可以将问题转化为求较小数与两数相除余数的最大公约数。通过不断迭代这一过程,直到余数为零时,当前的除数即为最大公约数[^2]。 #### 最大公约数的计算 以下是使用C语言实现辗转相除法计算最大公约数的代码示例: ```c #include <stdio.h> int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } int main() { int num1, num2; printf("请输入两个整数: "); scanf("%d %d", &num1, &num2); printf("最大公约数为: %d\n", gcd(num1, num2)); return 0; } ``` #### 最小公倍数的计算 根据数学原理,两个整数的最小公倍数可以通过以下公式计算: \[ \text{LCM}(a, b) = \frac{|a \cdot b|}{\text{GCD}(a, b)} \] 这意味着,一旦获得了最大公约数,就可以轻松地计算出最小公倍数[^5]。 以下是结合最大公约数计算最小公倍数的完整C语言代码: ```c #include <stdio.h> int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } int lcm(int a, int b) { return (a / gcd(a, b)) * b; // 避免溢出,先除后乘 } int main() { int num1, num2; printf("请输入两个整数: "); scanf("%d %d", &num1, &num2); printf("最大公约数为: %d\n", gcd(num1, num2)); printf("最小公倍数为: %d\n", lcm(num1, num2)); return 0; } ``` #### Python实现 如果使用Python语言,也可以轻松实现辗转相除法: ```python def gcd(a, b): while b != 0: a, b = b, a % b return a def lcm(a, b): return abs(a * b) // gcd(a, b) num1 = int(input("请输入第一个整数: ")) num2 = int(input("请输入第二个整数: ")) print(f"最大公约数为: {gcd(num1, num2)}") print(f"最小公倍数为: {lcm(num1, num2)}") ``` 上述代码分别实现了最大公约数和最小公倍数的计算功能,并通过用户输入验证了结果[^3]。 ### 数学原理 辗转相除法的核心在于递归地减少问题规模。假设需要求解 \(a\) 和 \(b\) 的最大公约数,且 \(a > b\),则有: \[ \text{GCD}(a, b) = \text{GCD}(b, a \% b) \] 当 \(b = 0\) 时,最大公约数即为 \(a\)。基于此原理,可以快速收敛至最终结果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值