前言:

设两数分别为a和b,运行时间中,输入时间不算在内

(1)九章算术—更相减损法

判断a和b那个大,然后大数就减去小数的,再将减去得到的值赋予大数的位置,继续判断,直至两数相等,这时,a=b=最大公约数

适用于两数相差不大也不小

例:

如果a>b,则a=a-b;

如果吧b>a,则b=b-a;

当a,b相等时,最大公约数就是a或b(a,b相等)

int main()
{int a, b;scanf("%d %d", &a, &b);while (a != b){if (a > b)a -= b;elseb -= a;}printf("%d", a);
}

时间复杂度 = O (log (max (a, b)))

算法优缺点:很稳定,但是数据大了就很慢

比较平衡的算法,避免了模运算,且算法性能平稳.

(2)单相取余法

先判断a,b那个大,再用a和b的对小的取余,如果结果不为0,则让小的数-1,直至结果为0.

适用于两数相差较大,且其中一个数在数轴上离0比较近

int main()
{int a, b;scanf("%d %d", &a, &b);int n = a > b ? b : a; //最小值while (a % n != 0 || b % n != 0)--n;printf("%d", n);
}

优点:算法设计简单且稳定,时间复杂度 = O(min(a,b))<O(log(max(a,b)))所以比更相减损发快

缺点:因为时间复杂度 = O(min(a,b)),所以最小值越大,计算越慢

(3)欧几里得——辗转相除法

让两个数中的大数对小数取余,再将小数赋予大数,结果赋予小数,重复以上动作直至两数其中一个数为零,那么另一个就是最大公约数

int main()
{int a, b;scanf("%d %d", &a, &b);while (a && b){if (a > b)a %= b;elseb %= a;}printf("%d", a>b?a:b);
}

优点:时间复杂度 = O(logn)适用于大部分范围

缺点:如果遇到相差比较大的数,计算起来就会开始慢了

(4)函数递归法

通过函数调用自身达到求最大公约数的目的,运行速度快,但是不稳定

适用于两数相差较小时求最大公约数.

int fin(int a, int b)
{if (a > b)fin(a - b, b);else if (a < b)fin(b - a, a);elsereturn a;
}int main()
{int a, b;scanf("%d %d", &a, &b);printf("%d", fin(a,b));
}

栈溢出,不参与运行时间统计

优点:时间复杂度=O(1),速度非常快

缺点:需要注意栈溢出,且两数不能与0相差太远,否则一定栈溢出!!

总结:在数值较小的两个公因数之间,可以优先选择递归或者单相取余法;若是数值比较大,则优先选择辗转相除法;若数值飘忽不定,辗转相除法和更相减损法依情况而定.

C语言求最大公约数(四种)相关推荐

  1. C语言求最大公约数3种方法

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105163610 C ...

  2. C语言求最大公约数三种方法详解

    C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...

  3. python求两个数的最大公约数穷举法_C++求最大公约数四种方法解析

    C++求最大公约数的四种方法思路,供大家参考,具体内容如下 将最近学的求最大公约数的四种方法总结如下: 第一种:穷举法之一 解释:拿其中一个数出来,用一个临时变量(tem)保存,每次都把那两个数除以这 ...

  4. 最大公约数程序c语言,C语言求最大公约数(两种最简单的算法实现)

    第一种:用较小数的最大约数于较大数作求模元算 #include /* 求两个数的最大公约数 */ int main(){ int a,b,max,min,i,result; scanf("% ...

  5. 用C语言求平均数的四种方法

    1. 常规操作 两个数的平均数等于两数之和除以二 int main() {int a = 10;int b = 5;int c = a + b;printf("%d\n", c); ...

  6. 用C语言求最大公约数的4种方法

    C语言求最大公约数的四种方法如下: 辗转相除法:通过不断地交换两个数,使较大的数除以较小的数,最后得到的余数即为最大公约数. 更相减损术:通过不断地让两个数减去较小的数,最后得到的结果即为最大公约数. ...

  7. c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法

    C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...

  8. c语言怎样求最大公约数,c语言求最大公约数

    求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...

  9. C语言求最大公约数及最小公倍数

    C语言求最大公约数及最小公倍数 1. 最大公约数 1.1 定义 ​ 最大公约数(Greatest Common Divisor,GCD),也称最大公因数.最大公因子,是一种数学概念,指两个或多个整数共 ...

最新文章

  1. 特斯拉无人驾驶却在高速路驰骋,四名乘客喝酒唱歌开party,网友:12分应该扣给谁?...
  2. 联想无线网卡 linux驱动,ubuntu14.04手动安装博通官方无线网卡驱动时报错,
  3. 应用视觉设计_Day01
  4. 3.1.9 二级页表
  5. bashrc文件中环境变量配置错误,导致linux命令无法正常使用的解决方案
  6. 异常日志处理-ThrowsAdvice
  7. 小学生也能看懂的ArrayList底层原理
  8. Unity实现爆炸的伤害值计算
  9. mysql 拼sql_在MySQL中拼SQL语句
  10. Oracle 12C -- native left outer join的加强
  11. 线程结束后会自动关闭_多线程初级(1)
  12. bzoj 1603 打谷机
  13. 《软件质量保证与测试》读书笔记(一)
  14. layerdate时间控件不随着input框的滚动移动
  15. 武汉大花岭科目二考试说明
  16. MVP释义:做最小可行产品
  17. CS224W摘要12.Frequent Subgraph Mining with GNNs
  18. JDE910笔记2--OMW项目建立及简单使用[转]
  19. 项目启动成功,但是Eureka页面不显示
  20. 论金融IT公司程序员的职业发展

热门文章

  1. [转载]梯度、散度、旋度的关系
  2. 【PySpark】<Big Data>Spark概述
  3. html中如何给图片设置浮动,css – 如何在div中浮动图像
  4. 车间数字孪生解决方案(一)
  5. SAP HANA Procedure的Odata更新(POST)表操作
  6. PL/SQL 常用函数
  7. Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)
  8. 开发编码格式_编码和游戏开发
  9. java并发编程实战wwj----------------------第二阶段--------------01-02-03
  10. div+css静态网页设计 web网页设计实例作业 ——茶叶文化-适应响应(12页) 学生HTML个人网页作业作品下载