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

  • 题目要求
    • 常用写法(穷举法)
    • 辗转相减法
    • 辗转相除法
    • main函数
  • 整体代码

题目要求

运行最大公约数的常用算法,并进行程序的调式与测试。

常用写法(穷举法)

从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数便是最大公约数 。

int GreatestCommonDivisor1(int _x, int _y)
{int temp = _x > _y ? _y : _x;//取出偏小的那个值for (; temp > 2; temp--){    //从偏小的值由大到小找目标的最大公约数if (_x%temp == 0 && _y%temp == 0){return temp;}}return 1;      //最大公约数至少是1
}

辗转相减法

我们首先假设T为x和y的最大公约数
则易推知:x和y可以且一定是由若干个T相加得到的
若x>y,我们用x-y并将结果重新赋给x,此时相当于x变成了更少的T组成的了
我们继续通过循环判断x和y的大小,用大值减去小值…
最终一定会把T减到为0个,也就是x和y相等的时候…

int GreatestCommonDivisor2(int _x, int _y)
{while (1)     //辗转相减直到_x和_y相等;引用死循环{if (_x > _y){_x = _x - _y;}else if (_y > _x){_y = _y - _x;}else{break;  //相等时表明找到目标T,跳出循环}}return _x;      //任意返回_x或_y
}

辗转相除法

同样我们首先假设T为x和y的最大公约数
根据上述思想,我们可以当作x和y分别是由m个T和n个T构成的
那么通过辗转相减的思想可以理解为:T = mx (±) ny …(其中m和n未知但一定能通过数学思想解出)
进而我们来探讨:若x > y,我们用x / y = a…b【x➗y商为a余数为b】
接下来我们变形:x / y = a…b → x = y * a + b → b = x - a * y
对照 :T = mx (±) ny 与 b = x - a * y 我们变形出了一个很直接的等式;此时可以看出b相当于最大公约数T
用这个思想一直取模继续向下,最终x,y中一定会有一个值变为0,那么上一次循环中的b就是最大公约数。

int GreatestCommonDivisor3(int _x, int _y)
{while (_x*_y != 0)//1.保证被除数不为零//2._x和_y不是互相的倍数,否则直接返回较小那一个{if (_x > _y){_x %= _y;}else if (_x < _y){_y %= _x;}else{break;}}return _x == 0 ? _y : _x;//最终一定有一个变为0,它的上一次循环返回的值就是T
}

main函数

int main()
{printf("请输入两个数:");int x = 0;int y = 0;scanf("%d %d", &x, &y);int ret = GreatestCommonDivisor1(x, y);//变函数名实现调用printf("这两个数的最大公约数为:%d\n", ret);system("pause");return 0;
}

整体代码

#include<stdio.h>
#include<Windows.h>#pragma warning(disable:4996)int GreatestCommonDivisor1(int _x, int _y)
{int temp = _x > _y ? _y : _x;//取出偏小的那个值for (; temp > 2; temp--){    //从偏小的值由大到小找目标的最大公约数if (_x%temp == 0 && _y%temp == 0){return temp;}}return 1;      //最大公约数至少是1
}int GreatestCommonDivisor2(int _x, int _y)
{while (1)     //辗转相减直到_x和_y相等;引用死循环{if (_x > _y){_x = _x - _y;}else if (_y > _x){_y = _y - _x;}else{break;  //相等时表明找到目标T,跳出循环}}return _x;      //任意返回_x或_y
}int GreatestCommonDivisor3(int _x, int _y)
{while (_x*_y != 0)//1.保证被除数不为零//2._x和_y不是互相的倍数,否则直接返回较小那一个{if (_x > _y){_x %= _y;}else if (_x < _y){_y %= _x;}else{break;}}return _x == 0 ? _y : _x;//最终一定有一个变为0,它的上一次循环返回的值就是T
}int main()
{printf("请输入两个数:");int x = 0;int y = 0;scanf("%d %d", &x, &y);int ret = GreatestCommonDivisor1(x, y);//变函数名实现调用printf("这两个数的最大公约数为:%d\n", ret);system("pause");return 0;
}

C语言求最大公约数三种方法详解相关推荐

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

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

  2. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  3. 查看登陆系统用户的信息的三种方法详解

    查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [O ...

  4. 新浪微博怎么推广引流,微博推广引流的三种方法详解

    新浪微博怎么推广引流,微博推广引流的三种方法详解,#推广#营销 微博营销有哪些特点?#百收网SEO@千行助推 大家好,上一次内容讲了生意人如何将客户引流到自己的微信上去,受到很多朋友的喜爱,那么这一期 ...

  5. eclipse java 逆向工程_Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程 逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码. Mybaits 需要程 ...

  6. c语言程序π,C语言求圆周率π(三种方法)

    题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止. 题目2) 根据公式②,用前100项之积计算π的值. 题目1)提供了一种解法,题目2)提供了两种解法,请看解析. 题目1) ...

  7. c语言求圆周率 . 4,C语言求圆周率π(三种方法)(4页)-原创力文档

    C语言求圆周率π(三种方法) 题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止.题目2) 根据公式②,用前100项之积计算π的值.题目1)提供了一种解法,题目2)提供了两种 ...

  8. C语言求最小公倍数的三种方法

    第一种方法:累加法求 思路是,两个数字,要求他们的最小公倍数,那么这个最小公倍数,至少不要比这两个要求的数小.我们首先判断出两个数中较大的一个,然后判断这个数是否是要求的两个数的最小公倍数.如果不是, ...

  9. C语言求幂的三种方法

    用三种方法求幂值 一. 暴力递归 直接对x乘y次 int result(int x,int y) {int num=1;for (int i=1; i<=y; i++) {num*=x;}ret ...

最新文章

  1. UNITY3D拓展编辑器 - 目录
  2. Java并发:分布式应用限流 Redis + Lua 实践
  3. python制作桑基图_Python制作桑基图
  4. T100 section已经修改过
  5. android make 没反应
  6. IDisposable 接口介绍
  7. 图数据库应用系列(一):金融智能风控
  8. Android笔记:Activity
  9. STM32H7时钟树RCC分析--- CubeMx配置(三)
  10. grub2配置原理分析
  11. springBoot跨域注解@CrossOrigin
  12. 浏览器数据库 IndexedDB(一) 概述
  13. 【系列4】使用Dockerfile创建带tomcat的Centos Docker镜像
  14. cssrem转换工具_微信小程序开发-rem转换rpx小工具
  15. matlab瓶盖盖严检查,口服液瓶盖密封性的质量检测方法你知道吗?
  16. (KNN)K-近邻算法介绍和 Facebook签到位置预测案例应用
  17. 读书寄语之体现人生智慧的9个字
  18. Linux 运维是做什么的?有钱途吗?发展前景怎么样?
  19. 为什么要加上ROW FORMAT DELIMITED NULL DEFINED AS ‘‘;?
  20. Cisco IOS配置环境,路由器和交换机的基本连接配置方法和连通性

热门文章

  1. Fortify WebInspect学习
  2. windows下apache简单配置php解释器
  3. C语言 多线程实现TCP并发服务器
  4. FFmpeg —— 对mp4视频按时间剪切,生成新的mp4(附源码)
  5. 建筑工程造价常见的41个问题
  6. 性能指标TP50、TP90、TP99、TP999解读和学习
  7. Markdown使用中的一些点
  8. PTA Python程序设计-02
  9. Haplotype Reference Consortium:最大规模的单倍型数据库
  10. 该如何才能在cad快速看图软件上应用