为何自定义函数首次迭代后无法正常工作?C++代码问题排查
问题分析与修复
核心问题
你的代码中primos函数的变量x未初始化,导致第一次调用后残留脏值,后续素数判断逻辑完全失效:
- 第一次调用
primos(5)时,未初始化的x恰好累加1+5后等于6(5+1),返回true,此时x的值被保留为6。 - 第二次调用
divs(15)时,会检查到i=3满足15%3==0,接着调用primos(3)。此时x还是之前的6,累加1+3后变成10,10不等于3+1,返回false,导致divs(15)找不到符合条件的质因数,最终返回0,所以控制台输出50而非预期的53。
修复后的完整代码
#include <iostream> #include <stdlib.h> using namespace std; bool primos(int primo); int divs(int num); int dato, d2; int main() { cout << divs(5); cout << divs(15); return 0; } // 判断素数 bool primos(int primo) { int x = 0; // 关键:初始化x为0 for (int i = 1; i <= primo; i++) { if (primo % i == 0) { x += i; } } return x == (primo + 1); } // 获取最小质因数 int divs(int num) { for (int i = 2; i <= num; i++) { if (num % i == 0 && primos(i)) { return i; } } return 0; }
额外优化建议(可选)
素数判断的效率可以进一步提升:
- 循环只需遍历到
sqrt(primo),因为如果primo有大于其平方根的因数,必然对应一个小于平方根的因数。 - 可以直接统计因数的个数,而非累加和,逻辑更直观:
bool primos(int primo) { if (primo <= 1) return false; int count = 0; for (int i = 1; i * i <= primo; i++) { if (primo % i == 0) { count++; if (i != primo / i) count++; } } return count == 2; }
验证结果
修复后运行代码,控制台会输出53,与预期一致。
内容的提问来源于stack exchange,提问作者Cani77
相关产品推荐
相关产品推荐

