C++求范围内倍数和代码中,变量i为何卡在3无法递增?
你的C++求和函数死循环问题分析与修复
咱们先揪出导致循环卡住的核心原因:
- 你的内层循环条件写错了!原代码里用
x < range作为循环终止条件,但x是外层循环的变量(比如第一次是3),只要range大于3,这个条件就永远成立,直接进入死循环,所以会一直输出3,根本停不下来。 - 另外,你要收集的是x的倍数(也就是i的值),但你却把x本身push到vector里了,这完全不符合你的需求啊!
接下来咱们一步步修复你的代码:
1. 修复内层循环
把循环条件改成i < range,同时把push_back(x)改成push_back(i),这样就能正确遍历x的所有倍数了:
for (int i = x; i < range; i += x) { num.push_back(i); cout << i << " "; // 现在会输出3、6、9...直到小于range }
2. 初始化sum变量
你声明了int sum;但没有初始化,这会导致累加时出现未定义的随机值,必须改成:
int sum = 0;
3. 优化去重逻辑
你原来的嵌套循环去重效率很低,而且把重复元素设为0的方式不够优雅。咱们可以用std::unordered_set来存储倍数,它会自动帮我们去重,省去手动去重的麻烦:
// 把vector<int> num;改成unordered_set<int> num_set; unordered_set<int> num_set; // 内层循环里改成 num_set.insert(i);
之后求和的时候直接遍历set就行,不需要处理重复元素。
4. 其他小优化
- 函数参数里的
vector<int> nums改成const vector<int>& nums,避免不必要的拷贝,提升性能; - 可以加个判断,如果nums为空或者range小于等于0,直接返回0,增强鲁棒性。
完整修复后的代码
#include <iostream> #include <vector> #include <unordered_set> using namespace std; int sumOfNumberMultiplesOf(int range, const vector<int>& nums) { if (range <= 0 || nums.empty()) { return 0; } int sum = 0; unordered_set<int> multiples; // 收集所有符合条件的倍数,自动去重 for (int x : nums) { if (x != 0) { // 避免除以0的情况 for (int i = x; i < range; i += x) { multiples.insert(i); } } } // 求和 for (int num : multiples) { sum += num; } return sum; } int main() { vector<int> num; num.push_back(3); num.push_back(5); cout << sumOfNumberMultiplesOf(1000, num) << endl; return 0; }
这样运行后就能正确计算1000以内3和5的所有倍数之和啦,而且不会再出现死循环的问题。
内容的提问来源于stack exchange,提问作者user141131
相关产品推荐
相关产品推荐

