std::gcd是C++17引入的标准函数,需包含头文件并启用-std=c++17;接受两个同类型整数,负数取绝对值处理,std::gcd(0,5)返回5,std::gcd(0,0)抛出domain_error。
直接调用 std::gcd 是最简单的方式,但必须确认编译器支持 C++17 且启用了对应标准。它定义在 头文件中,只接受两个同类型的整数(int、long long 等),不支持浮点或负数(负数会被转为正数后计算)。
-std=c++17 或更高版本,否则会报错 ‘gcd’ is not a member of ‘std’
std::gcd(0, 5) 返回 5,std::gcd(0, 0) 抛出 std::domain_error
std::gcd(a, b) == std::gcd(b, a)
手动实现时推荐用迭代版,避免递归过深或栈溢出;核心逻辑是反复用大数对小数取余,直到余数为 0。关键陷阱在于符号和零值处理。
std::abs(a) 和 std::abs(b),否则 -12 % 8 得 -4,破坏算法收敛性while (b != 0) 循环,更新为 std::tie(a, b) = std::make_pair(b, a % b),或更兼容老标准的写法:int temp = a % b; a = b; b = temp;
a % b 不能直接写成 a - b * (a / b)
因为整数除法截断方向依赖符号,在 C++ 中 a / b 向零取整,导致该表达式在异号时与 % 不等价。例如 a = -10, b = 3:
a % b 是 -1(C++ 标准规定余数符号同被除数)a - b * (a / b) → -10 - 3 * (-3) → -10 + 9 = -1,看似一样;但若 a = 10, b = -3,a % b 是 1,而 a / b 是 -3,算出来却是 10 - (-3) * (-3) = 1 —— 这里碰巧一致,但逻辑不可靠b * (a / b) 可能中间结果溢出,而 a % b 是原子运算,编译器可优化为单条指令__gcd 能不能用可以快速验证逻辑,但它是 GNU 扩展,不是标准 C++,跨平台项目中应避免。MSVC 不支持,且行为与 std::gcd 不完全一致(比如对 0, 0 返回 0 而不抛异常)。

undefined reference
double 会截断)return __gcd(a, b); 没问题;但提交代码或封装库时,优先用 std::gcd 或自实现实际项目里最容易被忽略的是:GCD 函数通常假设输入是整数,但上游数据可能来自用户输入或文件解析——没做 std::abs 和零值检查的实现,在遇到负数或全零输入时会进入死循环或返回错误结果。