最大公约数(GCD)
标签: 机试攻略 - 高分篇
学习人数: 23.7k


高清播放
赞赏支持

最大公约数,相信大家高中的时候就知道了,如何用计算机来快速求解两个数的最大公约数是一个很常见的数学问题。

如果题目要求我们求两个数x和y的最大公约数,我们只需要记住下面这种方法就行了。

#include <stdio.h>  
  
int gcd(int a, int b) {  
    if (b == 0) return a;  
    else return gcd(b, a % b);  
}  
int main() {  
    int x, y;  
    scanf("%d%d", &x, &y);  
    printf("%d\n", gcd(x, y));  
}  


显然,大部分时候题目都不会出的这么直接,那么对于最大公约数一般会有哪些变形考法呢?

 

最简真分数
题目描述:
给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。
输入描述:
每组包含n(n<=600)和n个数,整数大于1且小于等于1000。
输出描述:
每行输出最简真分数组合的个数。
输入样例#:
7
3 5 7 9 11 13 15
输出样例#:
17
题目来源:
DreamJudge 1180

题目解析:通过分析题意可以发现,最简真分数的必要条件就是不可以继续约分,那么不可以继续约分,就说明分子和分母的最大公约数为1。因此,我们只需要枚举所有组合的情况然后判断GCD即可。

 

参考代码

#include <stdio.h>  
  
int gcd(int a, int b) {  
    if(b==0) return a;  
    else return gcd(b, a%b);  
}  
int main() {  
    int buf[605];  
    int ans, n;  
    while(scanf("%d", &n)!=EOF) {  
        for(int i=0; i<n; i++)  
            scanf("%d", &buf[i]);  
        ans=0;//答案个数  
        for(int i=0; i<n; i++)  
            for(int j=i+1; j<n; j++)  
                if (gcd(buf[i], buf[j])==1) ans++;  
        printf("%d\n", ans);  
    }  
    return 0;  
}  


另一种变形考法是:分数化简

例如:给你一个分数12/30,让你将它化简,很明显,我们都知道它的答案是2/5。
那么:如果给你一个分数x/y呢?如何化简?

我们可以得出:

x/y = (x/gcd(x,y))/(y/gcd(x,y))

那么只用求出他们的最大公约数,然后除一下就可以得到答案了。

登录查看完整内容


课后作业

学会求最大公约数(GCD)


登录后开始许愿

4 条上岸许愿
deepseek
2025年4月10日 12:28

1. 定义

  • 最大公约数(GCD)‌:两个或多个整数共有约数中最大的一个。例如,12和18的GCD是6。
  • 最小公倍数(LCM)‌:两个或多个整数公有的最小倍数。例如,4和6的LCM是12。

2. 计算方法

质因数分解法

  • GCD‌:取所有共有质因数的最小次数相乘。
    示例
    12=22×3112=22×31,18=21×3218=21×32
    GCD = 2min⁡(2,1)×3min⁡(1,2)=2×3=62min(2,1)×3min(1,2)=2×3=6。

  • LCM‌:取所有质因数的最大次数相乘。
    示例
    LCM = 2max⁡(2,1)×3max⁡(1,2)=22×32=362max(2,1)×3max(1,2)=22×32=36。

欧几里得算法(GCD专用)

通过反复用余数替换较大数,直到余数为0,最后的非零余数即为GCD。
示例:计算98和56的GCD:
98÷56=198÷56=1 余42 → 56÷42=156÷42=1 余14 → 42÷14=342÷14=3 余0 → ‌GCD=14‌。

LCM的快捷计算

利用公式:

LCM(�,�)=�×�GCD(�,�)LCM(a,b)=GCD(a,b)a×b​

示例:计算12和18的LCM:
LCM(12,18)=12×186=36LCM(12,18)=612×18​=36。

赞(0)
zoujian
2021年5月4日 21:43

#include <stdio.h>  
  
int gcd(int a, int b) {  
    if (b == 0) return a;  
    else return gcd(b, a % b);  
}  
int main() {  
    int x, y;  
    scanf("%d%d", &x, &y);  
    printf("%d\n", gcd(x, y));  
}  

 

赞(0)
zoujian
2021年5月4日 21:42

1

赞(0)
zoujian
2021年5月4日 21:42

 

 

#include <stdio.h>  

  

int gcd(int a, int b) {  

    if (b == 0) return a;  

    else return gcd(b, a % b);  

}  

int main() {  

    int x, y;  

    scanf("%d%d", &x, &y);  

    printf("%d\n", gcd(x, y));  

}  

赞(0)