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

运行时检查失败#2:变量‘k’堆栈损坏,求排查完全数查找代码问题

解决栈溢出问题:1-1000完全数代码的错误排查

嘿,我看到你在编写寻找1到1000之间完全数的代码时遇到了栈溢出的问题,那个Run-Time Check Failure #2 - Stack around the variable 'k' was corrupted提示其实很明确——你定义的数组k被越界访问了,咱们来一步步拆解问题并解决它:

问题根源

你定义的数组int k[11];只能容纳11个元素(索引范围是0到10),但当处理一些因子数量较多的数时(比如60有10个真因子,840更是有31个真因子),变量n会不断递增,最终导致k[n] = i;这行代码访问了数组边界之外的内存,破坏了栈的结构,从而触发了栈溢出的错误提示。

解决方案

有两种简单的方式可以修复这个问题:

方案1:扩大数组容量

直接把数组k的大小调整到足够容纳1000以内数的最多真因子数量(1000以内的数最多有31个真因子),比如设置为50或100,这样就不会出现越界问题。修改后的代码如下:

#include<iostream>
using namespace std;
int main() {
    int k[50]; // 扩大数组容量,避免越界
    int i, a, n, s;
    for (a = 2; a <= 1000; a++) {
        n = 0;
        s = a;
        for (i = 1; i < a; i++) {
            if (a % i == 0) {
                n++;
                s = s - i;
                k[n] = i;
            }
        }
        if (s == 0) {
            cout << a << " is a perfect number" << endl;
            cout << "its factors are:";
            for (i = 1; i <= n; i++) {
                cout << k[i] << " ";
            }
            cout << endl; // 补全之前省略的换行,让输出更规范
        }
    }
    return 0;
}

方案2:移除数组,直接打印因子

其实完全不需要用数组存储因子,当确认某个数是完全数时,重新遍历一次1到a-1,把能整除a的数直接打印出来即可。这种方式既节省内存,又彻底避免了数组越界的风险:

#include<iostream>
using namespace std;
int main() {
    int i, a, s;
    for (a = 2; a <= 1000; a++) {
        s = a;
        for (i = 1; i < a; i++) {
            if (a % i == 0) {
                s -= i;
            }
        }
        if (s == 0) {
            cout << a << " is a perfect number" << endl;
            cout << "its factors are:";
            for (i = 1; i < a; i++) {
                if (a % i == 0) {
                    cout << i << " ";
                }
            }
            cout << endl;
        }
    }
    return 0;
}

额外提示

1000以内的完全数其实只有3个:6、28、496,你可以用修改后的代码验证这一点,运行后就能看到正确的输出啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:10:10