前言

众所周知,最大公因数(gcd)是C++程序中第二常见的函数(仅次于判素数)。正因此,一个简单的gcd也能被不同的OIER写出不同的“境界”。

话不多说,直接开始!


第一境界:暴力枚举!

如果你是一个连while循环都没写过的超级蒟蒻(天南星科植物魔芋属植物),那么你该怎么写判最大公因数程序?

答案很简单:暴力枚举!

我们可以用循环变量i直接从A,B中的小值直接反向枚举到1,如果能同时被A,B整除,直接输出i就行了。

这样写虽然长(其实也不是很长),但也是最直白的思路了:

int gcd(int a,int b)
{for(int i=min(a,b);i>=1;i--)if(a%i==0&&b%i==0) return i;
}

但这样写的时间复杂度是O(min(a,b)),因此一旦A,B都特别大的时候(比如说都是2的31次方),这种方法的运行速度将会比乌龟还慢,自然会时间超限(TLE)。


第二境界:辗转相除法

很快,你就学会了while循环,同时也去百度上搜索了辗转相除法

辗转相除法就是定义一个变量R来储存A模B的值,再将A的值设为B,B的值设为R。以此类推,直到B=0为止。然后直接输出A就行了。

这样写虽然长了一点,但是时间复杂度获得了飞跃性的提升:

int gcd(int a,int b)
{while(b>0){int r=a%b;a=b;b=r;}return a;
}

作为一名初学者,会这段程序就够了(bushi)。


第三境界:递归

一个寒假过去了,曾经的那名蒟蒻终于学会了递归。

你发现,用递归写最大公因数又快了很多。

用递归写最大公因数,还是基于辗转相除法。这样写,当A模B等于0时,返回B;否则返回递归求解B和A模B的最大公因数的值。

于是,你写出了一段递归求解的程序:

void gcd(int a,int b)
{if(a%b==0) return b;else return gcd(b,a%b);
}

可这样写在OJ上没有通过。奇怪,百度上不是那么写的吗?

事实上,根据辗转相除法的性质,应该是在B等于0是返回此时A的值,而不是在当A模B等于0时返回B的值。

你把程序改了一下,果然通过(AC)了这道题目:

int gcd(int a,int b)
{if(b==0) return a;else return gcd(b,a%b);
}

第四境界:三元组

        你在《信息学奥赛一本通》中学到了有关三元组的知识。

"啊?三元组?这似乎能运用到gcd上啊。"

事实上,三元组在时间复杂度上与递归相比并没有变快。但是,使用三元组,原本两行的代码变成了一行。

于是,求最大公因数的算法由两行变成了一行:

int gcd(int a,int b)
{return (b==0?a:gcd(b,a%b);}

第五境界:编译器自带函数!

前段时间,你在一篇题解上发现了__gcd这个编译器自带函数。

        于是你一口气写出了判最大公因数的整个程序(真的只用了一口气的时间):

#include<bits/stdc++.h>
using namespace std;
int main()
{int a,b;cin>>a>>b;cout<<__gcd(a,b);return 0;
}

第六境界:从__gcd变回gcd

但作为一名热爱共产党的新时代青少年,怎么能在gcd的前面加上两道杠呢?(你可以用键盘打出"gcd"试试)。

难道是退回第四境界呢?当然不行。作为一名合格的OIER,写的算法当然要及时更新迭代,不可以落后。

于是,你请出了#define语句(话说#define是真的好用),用它写出了“货真价实”的gcd:

#include<bits/stdc++.h>
#define gcd __gcd
using namespace std;
int main()
{int a,b;cin>>a>>b;cout<<gcd(a,b);return 0;
}

(无疾而终?)

点赞5个,更新下一期!

C++求最大公因数(gcd)的六重境界相关推荐

  1. 【有三吐槽】程序员改BUG的六重境界,你,第几重了?

    文章首发于微信公众号<有三AI> [有三吐槽]程序员改BUG的六重境界,你,第几重了? 作为一个程序员,我们也有丰富多彩的bug人生啊,咱们又开新专栏了(实在是有感于最近大家问我的问题), ...

  2. 学习算法的七重境界,我在撸串境界,你在哪一重?

    作者 | liuyubobobo 来源 | 是不是很酷 今天这篇推文,聊一聊我眼里的,知识掌握的七个境界. 第一重境界:撸串境界 知识掌握的第一重境界,我管它叫"撸串境界".什么意 ...

  3. 软件配置管理七重境界

    软件开发热点词汇不断推陈出新,cmmi,agile,精益,持续交付,持续集成,灰度--但有一个词其实一直在那里,支持着各种各样的新热点,它是#软件配置管理#. 它也是影响团队软件开发效率的重大因素. ...

  4. python求最大公因数函数_面试试讲 | 17学员音频示范《最大公约数》+教案+试讲稿...

    教材部分 02 教案部分 <最大公因数>教案 人教版小学数学五年级 下册第四单元第六课时 一.教学目标 1.知识与技能目标:学生能够找出两个数的公因数,并能找出最大公因数.2.过程与方法目 ...

  5. C++ 求最大公因数

    有若干种方法可以求最大公因数,这里只介绍两种 辗转相除法 #include<iostream>using namespace std;int gcd(int n,int m){if(n % ...

  6. C语言_公倍数、最小公倍数_调用函数求最大公因数最小公倍数

    公倍数:两个或两个以自然数共同的倍数. 最小公倍数:两数(多个数)相乘除以两数(多个数)的最大公约数. //最小公倍数 #include<stdio.h> int main() {int ...

  7. 求最大公因数的三种算法及简要说明

    求最大公因数的三种算法及简要说明 1.连续整数法 从给定的最小的数开始按1递减,直至找到一个能被两者都整除的数. public static int gcd1(int x, int y){int mi ...

  8. 常见算法题(1)求最大公因数

    最大公因(约)数,是指两个或多个整数共有因数中最大的一个.两个数a,b的最大公因数记作(a,b). 求最大公因数的算法有: (1)辗转相除法 有两整数a和b:     ① a%b得余数c     ② ...

  9. Java求最大公因数

    Java求最大公因数 一 . 求最大公因数(辗转相除法) 例: 求567与405的最大公因数:567 / 405 = 1 (余162)405 / 162 = 2(余81)162 / 81 = 2(余0 ...

最新文章

  1. 实测实量数据表格_施工现场全套实测实量操作图解,值得收藏!
  2. feachall php_timthumb.php详解
  3. python培训机构推荐-广州有哪些不错的python培训班
  4. 【OpenCV入门指南】第五篇轮廓检测 下
  5. 机器人鸣人是哪一集_火影里的五个机器人,第一个比鸣人还厉害,机器丁次你都没见过...
  6. 电子词典系统vc++_电子词典系统
  7. SAP UI5 应用开发教程之五十三 - 如何自定义 SAP UI5 数据类型(Data Type)试读版
  8. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
  9. ai伪造论文实验数据_5篇有关AI培训数据的基本论文
  10. 宽量程电压电流 stm32_万用表你只会量电压电流?史上最全万用表手册,这么做你不会烧表...
  11. Spark SQL(一)之简介
  12. 莉莉丝《剑与远征》:基于阿里云全站加速提升用户体验
  13. centos7 如何安装部署k8s_架构运维篇(五):Centos7/Linux中安装部署RocketMQ
  14. PaddlePaddle飞桨OCR文本检测——识别模型训练(三)
  15. UVALive - 5713 最小生成树
  16. hdu1251统计难题
  17. 注意力稀缺的时代,写作软件如何选择?
  18. java就业培训教程 笔记
  19. mcgs组态连接oracle数据库,昆仑通态专题(九):MCGS组态软件的实时数据库
  20. 数字孪生技术协助信息物理系统构建数字化城市

热门文章

  1. 菜刀php提权,遇见一个权限很大的机器,菜刀提权过程 -电脑资料
  2. 推荐一个可以下载任何插件的网站
  3. java实现百度站长主动推送个人网站链接
  4. 打开见识,保持努力,直到出类拔萃
  5. 易优cms foreach 数据循环输出标签
  6. nodejs+vue+elementui中国古诗词检索查询系统springboot+java
  7. 程序员进阶!读完我这份《Android开发核心源码精编解析》面试至少多要3K!已拿到offer
  8. stata实证之前通常处理步骤
  9. 众美集团轻奢洋房耀目津城 众美·南湖湾开盘劲销
  10. 如何用python制作温度计模拟器 python项目小发明 【安安教具】-【物理】-【温度计】模拟器