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

求各位和为10的倍数的n位数代码出现Segmentation Fault问题求助

修复你的C++代码段错误问题

嘿,我帮你找出了代码里导致Segmentation Fault的几个关键问题,还有一些逻辑漏洞,一起来看看:

问题分析

  • 递归死循环触发栈溢出:你在print函数里用while (start != 0)拆分数字求和,循环结束后start已经被改成0了!之后递归调用print(start + 1, end, 0)其实是在调用print(1, end, 0),这会无限递归下去,把栈空间耗尽,直接触发段错误。
  • pow函数的精度陷阱:pow返回的是double类型,直接转int会有精度丢失风险。比如pow(10,2)可能返回99.9999999,转成int就变成99,而不是你想要的100,导致遍历范围完全错误。
  • 输出错误变量:当你找到符合条件的数时,输出的是已经被循环改成0的start,根本不是原来的那个n位数。

修复后的代码

我重新调整了逻辑,用迭代代替递归,还修复了精度问题,代码如下:

#include <iostream>
using namespace std;

// 单独计算数字的各位之和,不修改原数字
int getDigitSum(int num) {
    int sum = 0;
    while (num != 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

// 用for循环遍历,避免递归栈溢出
void printValidNumbers(int start, int end) {
    for (int i = start; i < end; ++i) {
        if (getDigitSum(i) % 10 == 0) {
            cout << i << endl;
        }
    }
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        // 用整数运算生成正确的n位数范围,避开pow的精度问题
        int start = 1;
        for (int i = 1; i < n; ++i) {
            start *= 10;
        }
        int end = start * 10;
        printValidNumbers(start, end);
    }
    return 0;
}

修改关键点说明

  1. 把求和逻辑抽成独立函数,保证遍历的数字不会被修改;同时用迭代代替递归,既避免了栈溢出问题,也让代码逻辑更直观。
  2. 用整数循环计算起始和结束值,彻底避开了浮点数转整数的精度坑,确保遍历的是准确的n位数范围。
  3. 输出当前遍历的i,保证打印的是符合条件的原始数字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:12:23