看大家都用的y总的模板,我就来分享一个递归的模板,仅供参考喵~
试除法求约数
(递归回溯) $O(\sqrt{n})$
开门见山直接上代码,解释看注释
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int n = 0;
void fun(int k,int x) // 从k后开始枚举到sqrt(x)
{
for(int i = k + 1;i * i <= x;i++)
{
if(x % i == 0)
{
cout<<i<<" "; // 先输出枚举到的一组约数中<=sqrt(x)的前半部分
fun(i,x); // 递归枚举下一组约数
if(i != x / i) // 在所有前半部分输出回溯后开始从小到大输出每组与前半部分不同的后半部分
{
cout<<x / i<<" ";
}
break; // 每次调用只需确定一组即可
}
}
}
int main()
{
cin>>n;
while(n--)
{
int x = 0;
cin>>x;
fun(0,x);
cout<<endl;
}
return 0;
}