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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:48