You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现GCD查找算法代码运行异常 求助错误定位

C语言GCD计算代码错误排查

你的代码存在4个直接导致运行崩溃或结果错误的问题:

  • 递归终止条件完全错误:当前逻辑只有x或y等于0时才会输出结果,但正常非0输入的递归流程里x、y永远不会降到0,计数器i会无限自增,最终触发递归栈溢出,程序直接崩溃无任何输出。
  • 静态变量使用错误:
    1. 用static修饰的计数器i和结果变量sum只会在函数第一次被调用时初始化一次,后续如果重复调用函数计算其他数对的GCD,上次运行残留的变量值会直接导致计算结果完全错误。
    2. 当x、y都能被i整除时,做完除法你直接对i自增,漏掉了同一个公因子多次出现的场景——比如计算8和16的GCD,i=2第一次整除后得到4和8,这时候如果i直接加到3,就漏了剩下两个数里还存在的公因子2,最终算出来的结果会错成2,实际GCD是8。
  • 因子枚举逻辑缺失边界判断:i从2开始递增,没有设置i的上限,当i超过x、y的最小值后,递归还会一直无意义执行下去,直到栈溢出。
  • 返回值逻辑缺失:函数声明返回值类型为int,但整个函数内没有任何return语句,属于C语言未定义行为,运行时可能出现不可预期的异常。

修正方案

优先推荐用实现更简洁、运行效率更高的欧几里得算法重写GCD逻辑,不需要维护额外的计数器和结果变量,从根源上避免枚举因子带来的边界问题,修正后可直接运行的代码如下:

#include <stdio.h>

int gcd(int x, int y);

int main()
{
    int x, y;
    printf("Input 1st number: ");
    scanf("%d", &x);
    printf("Input 2nd number: ");
    scanf("%d", &y);
    // 兼容负数输入,GCD结果恒为非负值
    if (x < 0) x = -x;
    if (y < 0) y = -y;
    printf("The GCD is: %d", gcd(x, y));
    return 0;
}

int gcd(int x, int y)
{
    // 欧几里得算法终止条件:余数为0时,非0参数就是两数的最大公约数
    if (y == 0) {
        return x;
    }
    return gcd(y, x % y);
}

如果你要保留原本枚举公因子的实现思路,需要去掉静态变量、补全终止条件、修正因子重复判断逻辑,参考实现如下:

#include <stdio.h>

int gcd(int x, int y);

int main()
{
    int x, y;
    printf("Input 1st number: ");
    scanf("%d", &x);
    printf("Input 2nd number: ");
    scanf("%d", &y);
    if (x < 0) x = -x;
    if (y < 0) y = -y;
    printf("The GCD is: %d", gcd(x, y));
    return 0;
}

int gcd(int x, int y)
{
    int res = 1;
    for (int i = 2; i <= x && i <= y; i++) {
        // 同一个公因子可能出现多次,只要还能整除就一直计入结果
        while (x % i == 0 && y % i == 0) {
            res *= i;
            x /= i;
            y /= i;
        }
    }
    return res;
}

测试用例验证:输入12和18时,两个版本代码都会正确输出GCD为6;输入0和5时正确输出5;输入-24和16时正确输出8,无栈溢出问题。

内容的提问来源于stack exchange,提问作者Burak İsmailoğlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:39:17