C语言实现GCD查找算法代码运行异常 求助错误定位
C语言GCD计算代码错误排查
你的代码存在4个直接导致运行崩溃或结果错误的问题:
- 递归终止条件完全错误:当前逻辑只有x或y等于0时才会输出结果,但正常非0输入的递归流程里x、y永远不会降到0,计数器
i会无限自增,最终触发递归栈溢出,程序直接崩溃无任何输出。 - 静态变量使用错误:
- 用
static修饰的计数器i和结果变量sum只会在函数第一次被调用时初始化一次,后续如果重复调用函数计算其他数对的GCD,上次运行残留的变量值会直接导致计算结果完全错误。 - 当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
相关产品推荐
相关产品推荐

