求解最大公约数---欧几里得算法与连续整数检测法

前言:m,n的最大公约数是指能够同时整除他们的最大正整数,接下来将介绍两种求解最大公因数的算法,分别是 欧几里得算法连续整数检测法

欧几里得算法:

将两个不全为0的非负整数的最大公约数用 gcd(m,n) 表示。
欧几里得算法采用的方法是重复应用 gcd(m,n) = gcd(n,m%n) (m%n表示 m 除以n的余数)等式,直到m%n等于0。
例如:gcd(60, 24) = gcd(24, 12) = gcd(12, 0) = 12

算法结构性分析:

  1. 如果 n = 0 ,就返回 m , 结束程序
  2. r = m%n,将m%n的余数赋给r;
  3. 将 n 赋给 m,再将r赋给n,返回第一步。
#include <stdio.h>
int main()
{
    int n,m;//m,n是不全为0的非负整数 
    int r;
    printf("请输入m,n:");
    scanf("%d%d",&m,&n);
    while(n!=0)
    {
   	 r = m%n;
   	 m = n;
   	 n = r;
   }
    printf("%d",m);
    retur 0;
} 

连续整数检测法

根据定义可知,n与m的最大公约数不会大于Min(m,n),将Min(m,n)赋值给t,然后判断t是否能同时整除m,n,若不能,将 t -1。重复上述步骤直到找到最大公约数。

算法结构性分析:

  1. 将Min(m,n)赋值给t;
  2. m 除以 t,如果余数为0,进入第三步,否则进入第四步
  3. n 除以 t,如果余数为0,则返回 t,结束算法;否则进入第四步
  4. 将 t 的值减一,返回第二步;
#include <stdio.h>
int main()
{
	 int n,m;//m,n是不为0的正整数 
	 int t;
	 printf("请输入m,n:");
	 scanf("%d%d",&m,&n); 
	 if(m>n){
	 	 t = n;
	 }else{
	  	t = m;
	 }
	 while(t!=0){
		  if(m%t==0 && n%t==0) break;
		  else t--;
	 }
	 printf("%d",t);
	 return 0;
} 

值得注意的是这里m,n的取值范围是不为0的正整数,这里m,n不能为0,为0时计算出来的结果时错误的。

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值