任意の非負整数Nの約数を求めたい場合、愚直な実装をすると1からNまでの数字すべてがNの約数かどうかを確認することになると思います。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int>ans; for (int i=1;i<=n;i++)if(n%i==0)ans.emplace_back(i); for (int i=0;i<ans.size();i++)cout << ans[i] << endl; return 0; }
となると思います。
しかし、約数が見つかったときに、N//iも約数として列挙するようにすると、計算量√Nで約数をすべて列挙することができます。
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int>ans; set<int>irane; for (int i=1;i<=int(sqrt(n))+10;i++){ if(n%i!=0)continue; if(irane.count(i)>0)continue; ans.emplace_back(i); ans.emplace_back(n/i); irane.insert(i); irane.insert(n/i); } sort(ans.begin(),ans.end()); for (int i=0;i<ans.size();i++)cout << ans[i] << endl; return 0; }
set使わない方が良かったな…(あとでカエル)