最大公约数gcd函数简介

news/2025/1/11 23:40:36/

gcd函数简介

最大公因数(英语:highest common factor,hcf)也称最大公约数(英语:greatest common divisor,gcd)是数学词汇,指能够整除多个整数的最大正整数。而多个整数不能都为零。例如8和12的最大公因数为4。

求两个整数最大公约数主要的方法:
1.穷举法:分别列出两整数的所有约数,并找出最大的公约数。
2.素因数分解:分别列出两数的素因数分解式,并计算共同项的乘积。
3.短除法:两数除以其共同素因数,直到两数互素时,所有除数的乘积即为最大公约数。
4.辗转相除法:两数相除,取余数重复进行相除,直到余数为0时,前一个除数即为最大公约数。
相关介绍: https://blog.csdn.net/Ljnoit/article/details/104730787

gcd函数写法

C++写gcd函数有几种写法,下面介绍几种。
这些代码我都对拍过,请大家放心使用。

  • while循环
    此段代码a、b可以为0
inline int gcd(int a,int b) {int r;while(b>0) {r=a%b;a=b;b=r;}return a;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  • 三目运算符
    此段代码a、b可以为0
inline int gcd(int a,int b) {return b>0 ? gcd(b,a%b):a;
}
  • 1
  • 2
  • 3

  • 位运算
    此段代码a、b不能为0
inline int gcd(int a,int b) {while(b^=a^=b^=a%=b);return a;
}
  • 1
  • 2
  • 3
  • 4
原理

(b^=a^=b^=a%=b)相当于(b^=(a^=(b^=(a%=b))))相当于a%=b,b^=a,a^=b,b^=a
其中b^=a,a^=b,b^=a相当于swap(a,b),详见卡常技巧第3条。
所以(b^=a^=b^=a%=b)等价于a%=b,swap(a,b),这就是gcd函数的一般写法。


  • if+while
    此段代码a、b可以为0
inline int gcd(int a,int b) {if(b) while((a%=b) && (b%=a));return a+b;
}
  • 1
  • 2
  • 3
  • 4

  • 辗转相除法
    此段代码a、b不能为0
inline int gcd(int a,int b) {if(a%b==0) return b;else return (gcd(b,a%b));
}
  • 1
  • 2
  • 3
  • 4

  • gcd库函数
    此段代码a、b可以为0
#include <algorithm>
inline int gcd(int a,int b) {return __gcd(a,b);
}
  • 1
  • 2
  • 3
  • 4

http://www.ppmy.cn/news/492926.html

相关文章

解决编译.spec:rpm build with: fg: no job control报错

报错&#xff1a;rpm build with "fg: no job control"解决&#xff1a; # emacs rpm/test.spec %build %make_build替换为&#xff1a; %build make %{?_smp_mflags}

bg和fg指令(整理)以及 Linux中Ctrl+C、Ctrl+D等按键操作进程相关命令

fg(前台执行) frontground bg(后台执行) background linux提供的fg和bg命令&#xff0c;可以让我们轻松调度正在运行的任务 假如你发现运行的一个程序需要很长的时间&#xff0c;但是需要干别的事情&#xff0c;你就可以用ctrl-z挂起这个程序&#xff0c;然后可以看到系统的提…

Unix或Linux中、jobs、fg、bg等命令的使用方法

fg、bg、jobs、&、ctrl z都是跟系统任务有关的&#xff0c;虽然现在基本上不怎么需要用到这些命令&#xff0c;但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后&#xff0c;可以把这个命令放到后台执行 二.ctrl z 可以将一个正在前台执行的命令放到后…

前后台切换命令(ctrl+z jobs bg fg )

当我在终端里面运行某个命令的时候&#xff0c;结果不是很快就能出来的那种&#xff0c;或者是一大堆字在屏幕上狂翻。这个时候&#xff0c;有时ctrlc也不起作用&#xff0c;那我会用ctrlz退出来&#xff0c;这个很有效&#xff0c;但是说实话我不知道为什么这个可以退出&#…

tkinter实现屏幕窗口弹幕

tkinter实现屏幕窗口弹幕 构思创建类制定 init 函数 移动退出启动多线程无背景 完整代码TinReader可移动工具栏写在最后 构思 我在CSDN上看了一篇文章&#xff0c;叫做 “tkinter制作弹幕”。但这并不是真正意义上的弹幕&#xff0c;而仅仅是弹窗&#xff0c;同时如此多的窗口…

Linux进程管理命令:nohup、、jobs、fg、bg、ps、kill

对Linux进程的管理是我们经常遇到的&#xff0c;如何查看一个进程的状态&#xff1f;如何把一个后台的进程调至进程执行&#xff1f;如何杀死一个进程…看了本文后&#xff0c;你将会全部掌握&#xff01; 1. nohup nohup的用法&#xff1a; 用途&#xff1a;不挂断地运行命…

bg、fg、、vim 中:! 的使用-终端中简单的任务调度

背景 1、在终端里用 vim 编辑多个文件&#xff0c;修改了某个文件后&#xff0c;想调试一下&#xff1b;如果把 vim 关闭掉&#xff0c;调试完之后发现代码还是没通过&#xff0c;又得重新打开 2、同一个终端中频繁切换不同的应用&#xff0c;每次都要重新关闭上一个打开一个新…

Systemd方式Docker代理服务器设定

越来越多的LInux发行版开始使用Systemd管理服务&#xff0c;下面来看一下如何用Systemd的方式设定Docker的代理服务器。 为什么要设定&#xff1f; 在公司内网如果不设定代理服务器&#xff0c;Docker无法进行docker search和docker pull等与网络相关的操作。在docker pull的…