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

C++程序输出前4个三角平方数异常:仅输出0,求排查

搞定你的三角平方数程序问题!

嘿,作为C++新手遇到这种输出不符合预期的情况太正常啦,我来帮你捋清楚问题出在哪,再给你一个能正常跑的方案~

首先,你说程序只输出Square Triangular Number 1 is: 0,大概率是这几个原因之一:

常见问题排查

  • 初始值设错了:你可能把起始检查的数字设成了0,而0确实既是三角数(0=0×1/2)又是平方数(0=0²),但我们要的是1、36这些正整数的结果,而且如果你的循环逻辑有问题,可能输出0之后就没继续找后面的数了。
  • 判断逻辑有误:你可能没正确实现“既是三角数又是平方数”的判断逻辑——比如只检查了平方数,或者三角数的判断公式写错了。
  • 变量类型不够大:虽然前4个三角平方数用int还装得下,但如果计算过程中(比如算8×num的时候)不小心溢出,也会导致判断出错。

正确的实现思路&代码

先明确:三角数的公式是n(n+1)/2,平方数是k²,要找同时满足这两个条件的数,我们可以写两个辅助函数分别判断一个数是否是三角数、是否是平方数,然后遍历数字找符合条件的。

这里给你一个能正常输出前4个结果的代码:

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

// 判断是否为三角数
bool isTriangular(long long num) {
    long long discriminant = 1 + 8 * num;
    long long sqrtDisc = llround(sqrt(discriminant));
    // 两个条件:判别式是完全平方数,且(sqrtDisc-1)能被2整除
    return (sqrtDisc * sqrtDisc == discriminant) && ((sqrtDisc - 1) % 2 == 0);
}

// 判断是否为平方数
bool isSquare(long long num) {
    long long sqrtNum = llround(sqrt(num));
    return sqrtNum * sqrtNum == num;
}

int main() {
    int foundCount = 0;
    long long currentNum = 1; // 从1开始,跳过0

    cout << "前4个三角平方数:" << endl;
    while (foundCount < 4) {
        if (isTriangular(currentNum) && isSquare(currentNum)) {
            cout << "Square Triangular Number " << ++foundCount << " is: " << currentNum << endl;
        }
        currentNum++;
    }

    return 0;
}

代码关键点解释

  1. 用long long代替int:虽然前4个结果用int没问题,但三角平方数增长极快,用long long能避免后续扩展时的整数溢出问题。
  2. 三角数的判断逻辑:从三角数公式推导而来,n(n+1)/2 = num变形为n² +n -2num =0,判别式1+8*num必须是完全平方数,而且求解后的n必须是整数(也就是sqrt(判别式)-1能被2整除)。
  3. 平方数的判断:用llround取平方根的整数近似,再平方对比原数,避免浮点数精度误差导致的判断错误。
  4. 起始值从1开始:直接跳过0,符合我们要找的正整数结果。

调试小技巧

如果你想排查自己的代码问题,可以试试这些:

  • 单独测试判断函数:比如给isTriangular(1)、isSquare(36)传值,看返回结果是否正确,确认逻辑没问题。
  • 打印中间过程:在循环里加一行cout << "当前检查:" << currentNum << endl;,看看程序是否在正常遍历数字,以及判断结果是否符合预期。

内容的提问来源于stack exchange,提问作者user9319233

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:58:23