博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2028求最小公倍数(欧几里得)
阅读量:5931 次
发布时间:2019-06-19

本文共 1123 字,大约阅读时间需要 3 分钟。

用到了欧几里得算法:

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

这道题强调32位int,所以两个int相乘可能会超范围,所以求最小公倍数时要先除再乘

代码如下:

#include
#include
#include
#include
#include
using namespace std;//最大公因数int gcd(int a,int b){ if(b==0)return a; gcd(b,a%b); } int main(){ int n; int a,mul; while(cin>>n) { mul = 1; while(n--) { cin>>a; mul = a/gcd(a,mul)*mul;// mul = a*mul/gcd(a,mul);会超int } cout<
<
View Code

 

欧几里得证明:

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

证明:

      a可以表示成a = kb + r,则r = a mod b

  假设d是a,b的一个公约数,则有

  d|a, d|b,而r = a - kb,因此d|r

  因此d是(b,a mod b)的公约数

  假设d 是(b,a mod b)的公约数,则

  d | b , d |r ,但是a = kb +r

  因此d也是(a,b)的公约数

  因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

非递归代码:

  

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

 

转载于:https://www.cnblogs.com/lyqf/p/9740486.html

你可能感兴趣的文章
FTP
查看>>
注册页面的编写
查看>>
【原创】上传文件到github
查看>>
CoffeeScript
查看>>
关于Linux的WiFi总是处于software block : yes
查看>>
.NET中怎么有效的使用Cache
查看>>
如何给input[file]定义cursor
查看>>
Python简介
查看>>
教你50招提升ASP.NET性能(二十三):StringBuilder不适用于所有字符串连接的场景;String.Join可能是...
查看>>
【Linux】IPC-消息队列
查看>>
D.加边的无向图
查看>>
js 检验密码强度
查看>>
bootstrap在使用中的样式问题(自带的前台js分页和自己编写的后台分页方法)
查看>>
【转载】WinCE OAL中的RAM定制函数
查看>>
规律人生
查看>>
linux poll函数
查看>>
ubuntu docker 安装
查看>>
1.2环境的准备(二)之Pycharm的安装和使用
查看>>
结对学习感想及创意照
查看>>
(原创) alljoyn物联网实验之手机局域网控制设备
查看>>