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
相关产品推荐
相关产品推荐

