统计完全数的C++程序始终输出0,请求问题排查与修复
问题修复:完全数统计程序输出0的问题
你的程序始终输出0的核心原因是内层循环的终止条件错误:你用了输入的数字总数n的一半(j <= n/2),而不是当前要检测的数字k的一半。真因数的范围是1到k/2(大于k/2的数不可能是k的真因数,除了k本身),用n的一半会导致真因数之和计算完全错误,永远无法等于k。
修复后的代码
#include <iostream> #include <cmath> using namespace std; int main() { int n, k, count = 0; cin >> n; for (int i = 0; i < n; i++){ cin >> k; int sum = 0; // 修正:循环到当前检测数字k的一半,而非数字总数n的一半 for (int j = 1; j <= k / 2; j++) { if (k % j == 0) { sum += j; } } if (k == sum){ count++; } } cout << count; return 0; }
额外优化建议
- 变量命名语义化:用
count代替l、sum代替m,提升代码可读性。 - 优化计算效率:循环到
sqrt(k),找到因数j时同时添加k/j(需排除k本身和重复因数),减少循环次数:
int sum = 1; // 1是所有大于1的数的真因数 if (k == 1) sum = 0; // 1没有真因数 for (int j = 2; j <= sqrt(k); j++) { if (k % j == 0) { sum += j; int other = k / j; if (other != j && other != k) { // 避免重复添加和添加k本身 sum += other; } } }
内容的提问来源于stack exchange,提问作者loltrox
相关产品推荐
相关产品推荐

