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

C++中如何逐个返回所有除数?无需数组实现除数函数

实现逐个返回除数的函数

你的代码问题在于return语句会直接终止函数,循环只执行一次就退出,所以只能拿到第一个除数。要实现逐个返回除数且不用数组,有几种可行方案:

方案1:回调函数

把每个除数传递给外部定义的回调函数处理,函数本身不直接返回值,而是触发回调逻辑:

#include <iostream>

void allDivisor(int num, void (*callback)(int)) {
    for (int i = 1; i <= num; ++i) {
        if (num % i == 0) {
            callback(i); // 逐个传递除数给回调
        }
    }
}

// 示例:打印除数的回调函数
void printDivisor(int d) {
    std::cout << d << " ";
}

int main() {
    allDivisor(10, printDivisor); // 输出:1 2 5 10
    return 0;
}

方案2:C++20协程(生成器模式)

利用C++20的协程特性,实现类似生成器的效果,逐个"产出"除数,函数可以暂停和恢复:

#include <coroutine>
#include <iostream>

// 定义协程的返回类型
struct DivisorGenerator {
    struct promise_type {
        int current;
        DivisorGenerator get_return_object() { 
            return {std::coroutine_handle<promise_type>::from_promise(*this)}; 
        }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
        std::suspend_always yield_value(int value) {
            current = value;
            return {};
        }
    };

    std::coroutine_handle<promise_type> handle;
    ~DivisorGenerator() { if (handle) handle.destroy(); }

    // 控制协程执行,获取下一个除数
    bool next() {
        handle.resume();
        return !handle.done();
    }

    // 获取当前除数
    int value() { return handle.promise().current; }
};

DivisorGenerator allDivisor(int num) {
    for (int i = 1; i <= num; ++i) {
        if (num % i == 0) {
            co_yield i; // 产出当前除数,暂停函数
        }
    }
}

int main() {
    auto gen = allDivisor(10);
    while (gen.next()) {
        std::cout << gen.value() << " "; // 输出:1 2 5 10
    }
    return 0;
}

方案3:模板化函数对象(支持Lambda)

用模板接受任意可调用对象(比如Lambda),在循环中逐个处理除数,写法更灵活:

#include <iostream>

template<typename Func>
void allDivisor(int num, Func func) {
    for (int i = 1; i <= num; ++i) {
        if (num % i == 0) {
            func(i);
        }
    }
}

int main() {
    // 用Lambda直接处理除数,比如打印
    allDivisor(10, [](int d) {
        std::cout << d << " ";
    });
    return 0;
}

内容的提问来源于stack exchange,提问作者Deven Kumbhani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:50:28