三角数是形如1, 3, 6, 10, 15…的数,第n个等于n(n+1)/2;判断x是否为三角数,需验证(−1+√(1+8x))/2是否为正整数,实际编码中应先计算判别式d=1+8x,取整root≈√d,再检查root²==d且(root−1)为正偶数。

什么是三角数?为什么能用公式快速判断
三角数就是形如 1, 3, 6, 10, 15… 的数,即第 n 个三角数等于 n*(n+1)/2。反过来,若一个正整数 x 是三角数,则必然存在某个正整数 n 满足 x = n*(n+1)/2。整理这个等式可得二次方程:n² + n − 2x = 0。解出正根:n = (−1 + sqrt(1 + 8x)) / 2。所以只需验证这个 n 是否为正整数即可。
用 sqrt 和整数检查完成判定(C++ 实操)
核心是计算 sqrt(1 + 8*x),再检查它是否为整数、奇数,且除以 2 后结果为正整数。实际编码中要注意浮点精度问题,不能直接用 == 判断 sqrt 结果是否为整数。
推荐做法:
- 先算
discriminant = 1 + 8LL * x(用long long防溢出) - 用
sqrt(discriminant)得到浮点值,然后四舍五入取整为root - 验证
root * root == discriminant(绕过浮点误差) - 再检查
(root - 1) % 2 == 0 && root > 1,确保n = (root - 1) / 2是正整数
常见错误:溢出、浮点精度、边界值
int x = 1e9 时,8*x 就会溢出 int;sqrt 返回的 double 对大整数(如 > 2⁵³)无法精确表示整数,导致 round 或 floor 出错。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
安全写法示例:
bool isTriangular(long long x) {
if (x <= 0) return false;
long long disc = 1 + 8 * x;
long long root = round(sqrt((double)disc));
// 用整数平方验证 root 是否真为整数平方根
if (root * root != disc) return false;
return (root & 1) == 1 && root > 1; // root 必须是奇数且 ≥3
}替代方案:二分查找(适合不确定数值范围或避免浮点)
当不能依赖 sqrt(比如嵌入式环境无 math.h,或需要 100% 整数运算),可用二分在 [1, sqrt(2x)+1] 范围内找 n,使 n*(n+1)/2 == x。时间复杂度 O(log x),但常数小、无精度风险。
关键点:
- 上界设为
high = min(x, (long long)sqrt(2.0*x)+2)更稳 - 计算
n*(n+1)/2时仍要用long long,防止乘法溢出 - 比较时直接用整数运算,不引入任何浮点
真正麻烦的不是公式本身,而是 8*x 溢出和 sqrt 在边界处的表示误差——这两个地方一错,整个判定就不可靠。

















