短除法(求最大公约数)

原理:

短除法是求最大公因数的一种方法,也可用来求最小公倍数。求几个数最大公因数的方法,开始时用观察比较的方法,即:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数。后来,使用分解质因数法来分别分解两个数的因数,再进行运算。之后又演变为短除法。短除法运算方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是质数为止。

思路:

一开始是打算分别求出两个数的因数,对比找到公因数最后输出最大公因数的,后来发现只需要从两个数比较小的那个数从1到它本身开始寻找两个数的公因数输出最后的那个公因数就行了。

#include<stdio.h>

int main()
{
	int a, b;
	int temp,t;
	printf("请输入两个整数:");
	scanf_s("%d %d", &a, &b);

	if (a > b)
	{
		temp = a;
		a = b;
		b = temp;
	}

	for (int i = 1; i <= a; i++)
	{
		if (a%i == 0 && b%i == 0)
			t = i;		
	}

	printf("\n最大公约数为:%d\n",t );

	return 0;
}```

### 关于短除法算法的伪代码实现 短除法是一种用于解两个整数的最大公约数(GCD)的方法。它通过逐步分解质因数来简化计算过程,最终得到两者的最大公约数。 以下是基于短除法原理设计的一个伪代码实现: ```plaintext function gcd_short_division(a, b): if a == 0 or b == 0: return max(a, b) # 如果其中一个数为零,则返回另一个数作为结果[^5] common_factors = [] # 存储公共因子 divisor = 2 # 初始除数设为2 while True: divisible_a = (a % divisor == 0) # 检查a是否能被divisor整除 divisible_b = (b % divisor == 0) # 检查b是否能被divisor整除 if divisible_a and divisible_b: # 当前divisor是两者共同的因子 common_factors.append(divisor) a //= divisor # 更新a b //= divisor # 更新b elif not divisible_a and not divisible_b: # 如果当前divisor不是任何一方的因子,则尝试下一个可能的因子 divisor += 1 # 跳过偶数优化性能(除了2以外) if divisor > 2 and divisor % 2 == 0: divisor += 1 # 终止条件:当无法再找到新的公因子时退出循环 if a == 1 or b == 1: break result = 1 for factor in common_factors: result *= factor # 将所有公共因子相乘得到最大公约数 return result ``` 上述伪代码实现了短除法的核心逻辑,即不断寻找输入数值的公共因子,并将其累乘以获得最大公约数的结果[^6]。 #### 解释 - **初始状态**:设定`common_factors`为空列表存储所有的公共因子;初始化`divisor=2`表示从最小素数开始试探。 - **核心判断**:利用模运算检测当前试商能否同时整除给定的两个参数值 `a` 和 `b` 。如果是的话就记录下这个共享因子并将原数据相应缩小规模继续迭代下去直至找不到更多匹配项为止或者某个变量降到了单位量级(等于1). - **终止条件**:一旦任意一个操作对象缩减至单一单元级别(`a==1 OR b==1`)即可结束整个流程因为此时不可能存在更大的共约数了. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值