求各位和为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; }
修改关键点说明
- 把求和逻辑抽成独立函数,保证遍历的数字不会被修改;同时用迭代代替递归,既避免了栈溢出问题,也让代码逻辑更直观。
- 用整数循环计算起始和结束值,彻底避开了浮点数转整数的精度坑,确保遍历的是准确的n位数范围。
- 输出当前遍历的
i,保证打印的是符合条件的原始数字。
内容的提问来源于stack exchange,提问作者priyesh
相关产品推荐
相关产品推荐

