gcd(a, b),就是求a和b的最大公约数

lcm(a, b),就是求a和b的最小公倍数

然后有个公式

a*b = gcd * lcm     ( gcd就是gcd(a, b), ( •̀∀•́ ) 简写你懂吗)

解释(不想看就跳过){

  首先,求一个gcd,然后。。。

  a / gcd 和 b / gcd 这两个数互质了,也就是 gcd(   a / gcd ,b / gcd  )  =  1,然后。。。

  lcm = gcd *  (a / gcd) * (b / gcd)

  lcm = (a * b) / gcd

  所以。。a*b = gcd * lcm

}

所以要求lcm,先求gcd

辣么,问题来了,gcd怎么求

辗转相除法

while循环

LL gcd(LL a, LL b){
LL t;
while(b){
t = b;
b = a % b;
a = t;
}
return a;
}

还有一个递归写法

LL gcd(LL a, LL b){
if(b == 0) return a;
else return gcd(b, a%b);
} LL gcd(LL a, LL b){
return b ? gcd(b, a%b) : a;
}
//两种都可以

辣么,lcm = a * b / gcd

(注意,这样写法有可能会错,因为a * b可能因为太大  超出int  或者 超出 longlong)

所以推荐写成 : lcm = a / gcd * b

然后几个公式自己证明一下

gcd(ka, kb) = k * gcd(a, b)

lcm(ka, kb) = k * lcm(a, b)

上次做题碰到这个公式

lcm(S/a, S/b) = S/gcd(a, b)

S = 9,a = 4,b = 6,小数不会lcm,只好保留分数形式去通分约分。

当我看到右边那个公式。。。。

(╯°Д°)╯┻━┻

这TM我怎么想的到,给我证明倒是会证。 T_T

【附录】

这里给出使用欧几里得算法求最大公约数的递归和非递归的程序,同时给出穷举法求最大公约数的程序。

从计算时间上看,递推法计算速度最快。

程序中包含条件编译语句用于统计分析计算复杂度。

/*
* 计算两个数的最大公约数三种算法程序
*/ #include <stdio.h> //#define DEBUG
#ifdef DEBUG
int c1=, c2=, c3=;
#endif int gcd1(int, int);
int gcd2(int, int);
int gcd3(int, int); int main(void)
{
int m=, n=; printf("gcd1: %d %d result=%d\n", m, n, gcd1(m, n));
printf("gcd2: %d %d result=%d\n", m, n, gcd2(m, n));
printf("gcd3: %d %d result=%d\n", m, n, gcd3(m, n));
#ifdef DEBUG
printf("c1=%d c2=%d c3=%d\n", c1, c2, c3);
#endif return ;
} /* 递归法:欧几里得算法,计算最大公约数 */
int gcd1(int m, int n)
{
#ifdef DEBUG
c1++;
#endif
return (m==)?n:gcd1(n%m, m);
} /* 迭代法(递推法):欧几里得算法,计算最大公约数 */
int gcd2(int m, int n)
{
while(m>)
{
#ifdef DEBUG
c2++;
#endif
int c = n % m;
n = m;
m = c;
}
return n;
} /* 连续整数试探算法,计算最大公约数 */
int gcd3(int m, int n)
{
if(m>n) {
int temp = m;
m = n;
n = temp;
}
int t = m;
while(m%t || n%t)
{
#ifdef DEBUG
c3++;
#endif
t--;
}
return t;
}

关键代码(正解):

/* 迭代法(递推法):欧几里得算法,计算最大公约数 */
int gcd(int m, int n)
{
while(m>0)
{
int c = n % m;
n = m;
m = c;
}
return n;
}

数论3——gcd&&lcm的更多相关文章

  1. 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

    数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...

  2. 【HDU 5382】 GCD?LCM! (数论、积性函数)

    GCD?LCM! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  3. Mathematics:GCD & LCM Inverse(POJ 2429)

    根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...

  4. Least Common Multiple (HDU - 1019) 【简单数论】【LCM】【欧几里得辗转相除法】

    Least Common Multiple (HDU - 1019) [简单数论][LCM][欧几里得辗转相除法] 标签: 入门讲座题解 数论 题目描述 The least common multip ...

  5. 洛谷 UVA11388 GCD LCM

    UVA11388 GCD LCM Description of the title PDF The GCD of two positive integers is the largest intege ...

  6. POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)

    题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd   lcm/gcd=a/gcd*b/gcd 可知a/gc ...

  7. [POJ 2429] GCD & LCM Inverse

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10621   Accepted: ...

  8. POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)

    [题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...

  9. UVA - 11388 GCD LCM

    II U C   ONLINE   C ON TEST  Problem D: GCD LCM Input: standard input Output: standard output The GC ...

随机推荐

  1. %ROWTYPE在INSERT和UPDATE语句里的妙用

    PL/SQL里的ROWTYPE类型具有非常大的用处和灵活性,现在发现ROWTYPE在insert和update语句里的妙用,可以节省很多代码,特别是在行copy和更新的时候. 在INSERT语句中: ...

  2. 快速解决Kali 更新失败问题

    Kali Linux 2018.4 初学者在安装完kali 系统后第一件事往往就是更新软件,但在更新过程中通常会出现各种各样的问题,比如更新提示不含有 'maincontrib' 组件,跳过配置文件 ...

  3. (转)Maven POM中的各种scope的行为总结

    原地址:https://blog.csdn.net/cnweike/article/details/52221410 compile:默认的scope.任何定义在compile scope下的依赖将会 ...

  4. 创建私有CA并签发证书

    一.创建私有CA 1.创建所需要的文件 2.创建私有密钥 3.CA自签证书 -new: 生成新证书签署请求:               -x509: 专用于CA生成自签证书:不自签的时候不要加该选项 ...

  5. Mysql升级过程的问题

    升级安装5.6版本mysql linux环境下的yum默认mysql版本是5.1的,由于项目需要保存表情等4个字节的数据,版本受限,需要升级到5.6版本支持utf8mb4格式的编码. 升级过程大概就是 ...

  6. Laravel 5.5搭建(lunix-ubuntu)

    基本配置 PHP >= 7.0.0 PHP OpenSSL 扩展 PHP PDO 扩展 PHP Tokenizer 扩展 PHP XML 扩展 1:nginx sudo apt-get upda ...

  7. hadoop生态搭建(3节点)-07.hive配置

    # http://archive.apache.org/dist/hive/hive-2.1.1/ # ================================================ ...

  8. scala成长之路(5)问题记录

    还是在看scala sdk源码的时候,有很多问题要考自己慢慢摸索,这里做个记录. 一. 隐式转换的作用域? 隐式转换需要三个因素 1. 己方(当前对象) 2. 转换函数 3. 对方(转换的目标类) 这 ...

  9. MyBatis实现拦截器分页功能

    1.原理 在mybatis使用拦截器(interceptor),截获所执行方法的sql语句与参数. (1)修改sql的查询结果:将原sql改为查询count(*) 也就是条数 (2)将语句sql进行拼 ...

  10. java元注解(注解在注解上的注解)

    //ElementType.TYPE 给类.接口.枚举上使用 @Target(ElementType.TYPE)//给注解进行注解,表示该注解可以用在什么地方 //@Retention(Retenti ...