位置:首页 > 其他编程语言 > 「c语言程序设计求最大公约数」3种常用方法与代码示例

「c语言程序设计求最大公约数」3种常用方法与代码示例

时间:2026-08-13  |  作者:318050  |  阅读:0

在C语言程序设计中,求最大公约数是很常见的基础题。本文围绕c语言程序设计求最大公约数,讲清思路选择、3种常用写法、完整代码示例与结果验证方法,便于初学者直接上手练习。

先明确题目目标与输入输出

求最大公约数,通常是指输入两个整数,输出它们共同的最大因数。写程序前先把问题缩小到最基本的输入、计算、输出三个环节,这样代码结构会更清楚。

在练习场景里,最常见的是从键盘读入两个正整数,再输出结果。如果题目没有特别说明,通常默认处理正整数即可。若要让程序更稳妥,可以顺手补上对0的判断。

  • 输入两个整数a和b
  • 计算a和b的最大公约数
  • 输出最终结果,格式保持简洁清楚

三种常用求法怎么选

初学者最适合先掌握辗转相除法,因为它思路清楚、代码短、执行效率也高。在大多数教材、习题和面试基础题里,这都是默认首选写法。

如果你还在熟悉循环与条件判断,也可以先写枚举法。它运行慢一些,但非常直观,适合理解什么叫公约数、为什么最大那个就是答案。

更相减损术也是常见方法,适合帮助理解数值变化过程。不过它在某些数据下循环次数更多,所以实战里一般不如辗转相除法常用。

  1. 枚举法:从较小值向下查找,第一个同时整除两数的数就是答案。
  2. 辗转相除法:反复用余数替换,直到余数为0,效率高,最推荐。
  3. 更相减损术:反复用大数减小数,直到两数相等,便于理解过程。

辗转相除法完整代码示例

辗转相除法的核心是:两个数的最大公约数,等于较小数和余数的最大公约数。也就是说,只要不断把问题变小,最后就能收敛到结果。

写代码时,先保存余数,再更新两个变量。循环结束条件是b变成0,此时a就是最大公约数。这种写法短而稳,适合作为主力答案。

  • 完整示例

    #include 
    
    int main(void) {
        int a, b, t;
    
        if (scanf("%d %d", &a, &b) != 2) {
            return 1;
        }
    
        if (a < 0) a = -a;
        if (b < 0) b = -b;
    
        if (a == 0) {
            printf("%dn", b);
            return 0;
        }
        if (b == 0) {
            printf("%dn", a);
            return 0;
        }
    
        while (b != 0) {
            t = a % b;
            a = b;
            b = t;
        }
    
        printf("%dn", a);
        return 0;
    }
  • 编译命令:cc -std=c11 gcd.c -o gcd
  • 运行命令:./gcd

另外两种写法与结果验证

如果老师要求写出不同思路,枚举法和更相减损术也可以准备一份。它们不一定是最优答案,但很适合用来说明你理解了题目,不只是会背一种模板。

程序写完后,不要只测一组数据。最好覆盖普通情况、整除关系、两个数相等、含0输入、负数输入这几类情况,这样更容易发现边界错误,也能检验不同写法是否真正一致。

枚举法示例

  • 完整示例

    #include 
    
    int main(void) {
        int a, b, min, i;
    
        if (scanf("%d %d", &a, &b) != 2) {
            return 1;
        }
    
        if (a < 0) a = -a;
        if (b < 0) b = -b;
    
        if (a == 0 || b == 0) {
            printf("%dn", a > b  a : b);
            return 0;
        }
    
        min = a < b ? a : b;
        for (i = min; i >= 1; i--) {
            if (a % i == 0 && b % i == 0) {
                printf("%dn", i);
                break;
            }
        }
    
        return 0;
    }

更相减损术示例

  • 完整示例

    #include 
    
    int main(void) {
        int a, b;
    
        if (scanf("%d %d", &a, &b) != 2) {
            return 1;
        }
    
        if (a < 0) a = -a;
        if (b < 0) b = -b;
    
        if (a == 0) {
            printf("%dn", b);
            return 0;
        }
        if (b == 0) {
            printf("%dn", a);
            return 0;
        }
    
        while (a != b) {
            if (a > b) {
                a = a - b;
            } else {
                b = b - a;
            }
        }
    
        printf("%dn", a);
        return 0;
    }

建议测试数据

  • 测试样例1:输入: 24 18 输出: 6
  • 测试样例2:输入: 35 14 输出: 7
  • 测试样例3:输入: 9 9 输出: 9
  • 测试样例4:输入: 0 12 输出: 12
  • 测试样例5:输入: -18 24 输出: 6

结果验证方法

如果你要确认程序不只是“能跑出一个结果”,而是真的写对了,最稳妥的做法是按固定步骤验证三种算法。先分别输入普通数据,如24和18;再测试整除关系,如35和14;接着测试相等输入,如9和9;然后测试含0输入,如0和12;最后测试负数输入,如-18和24。

每测完一组数据,都按同样标准检查:第一,三种方法输出必须一致;第二,输出值必须同时整除两个输入的绝对值;第三,不应存在比当前输出更大的整数还能同时整除这两个数。只要这三条都成立,说明结果基本可靠。若某一种写法与另外两种结果不同,优先检查0处理、负数转正、循环结束条件这几个位置。

  • 先覆盖普通输入、整除关系、相等输入、含0输入、负数输入五类数据。
  • 每组数据都让枚举法、辗转相除法、更相减损术分别运行一次。
  • 验证标准是三种算法结果一致,且结果能整除两个输入,并且不存在更大的公约数。

标准答案推荐

如果这是作业提交、机考答题或教材例题,默认最推荐提交辗转相除法版本。原因很直接:代码最短,执行效率最高,逻辑最清晰,而且上面的示例已经把负数和0的边界情况补全了,拿来直接作为标准答案更稳妥。

枚举法和更相减损术更适合用来补充思路,或者应对“请写出两种以上方法”这一类题目要求。若题目只让你交一份程序,优先交辗转相除法版本即可。

  • 标准提交版本优先选辗转相除法。
  • 推荐理由是代码短、效率高、边界处理完整、最适合考试和作业。
  • 枚举法与更相减损术主要用于补充思路或满足多方法作答要求。

学习c语言程序设计求最大公约数时,先把辗转相除法写熟,再补充枚举法和更相减损术,基本就能覆盖课堂练习与常见机考题。真正提交时,优先使用辗转相除法标准答案,并按结果验证方法检查几组典型数据,代码会更稳。

来源:整理自互联网
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多