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

C++代码运行触发Abort trap: 6错误,请求排查与修复

搞定「Abort trap: 6」错误并优化你的异或二元组统计代码

让我一步步帮你排查问题并修复:

问题根源剖析

1. 数组越界直接触发崩溃

你代码里的arr[4]是固定大小数组,但在遍历二进制位时,只要当前数i的二进制中1的个数超过4(比如n≥5且i是全1的情况),x就会涨到4甚至更大,此时arr[x] = j+1会访问数组边界外的内存——这就是「Abort trap: 6」的直接诱因。而且哪怕最终只需要chk==2的情况,你还是会执行所有二进制位的赋值操作,纯纯做无用功还埋了内存坑。

2. 非标准变长数组暗藏隐患

ll res[t];这种写法是GCC的编译器扩展,并不是C++标准语法。小数据量下可能能跑,但t稍大就容易栈溢出,换个编译器甚至直接编译失败,完全不具备可移植性。

3. 算法效率低到离谱

你现在枚举所有2^n个数,这是指数级增长的复杂度!n=20就有百万次循环,n=30直接十亿次——别说得到结果,光等待运行结束都遥遥无期,完全没必要这么绕远路。

修复后的代码(附优化)

我把所有问题都改掉,同时大幅提升算法效率:

#include <iostream>
#include <vector>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    ll t;
    cin >> t;
    vector<ll> res(t);
    
    for (ll k = 0; k < t; ++k) {
        ll n, cnt = 0;
        cin >> n;
        
        // 直接枚举所有a < b的二元组,对应原逻辑中二进制恰好两个1的情况
        for (ll a = 1; a <= n; ++a) {
            for (ll b = a + 1; b <= n; ++b) {
                if ((a ^ b) <= n) {
                    ++cnt;
                }
            }
        }
        
        res[k] = cnt;
    }
    
    for (ll ans : res) {
        cout << ans << '\n';
    }
    
    return 0;
}

修复说明

  1. 彻底解决数组越界:直接枚举1≤a<b≤n的二元组,完全砍掉了容易出问题的arr数组,逻辑更直白,也彻底消除了内存访问风险。
  2. 用标准容器替代变长数组:std::vector<ll>是C++标准容器,安全、可移植,不会出现栈溢出问题。
  3. 复杂度从O(2^n)降到O(n²):原来的指数级复杂度直接变成多项式复杂度,哪怕n=1000也能轻松运行。
  4. 输入输出加速:添加ios::sync_with_stdio(false); cin.tie(nullptr);,处理大量测试用例时速度会明显提升。

如果你的n会非常大(比如n=1e4),O(n²)可能还是不够,可以再用数位DP进一步优化到O(n log n),但绝大多数常规题目场景下,上面的代码已经完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:38:15