简介
什么是约数:如果一个数a除以另一个数b的余数为0,即 a%b == 0, 则b是a的约数。
如何求一个数x的所有约数:
用 x 除以 1 到 x 的所有数,如果余数是0,则把除数加到答案中。
优化
如果 a / b = c···0,则一定有 a / c = b····0。所以一个数 x 的约数肯定是成对存在的,对称轴是 根号x。
因此,只需要用 x 除以 1 到 根号x 之间的数,如果余数是0,则把除数以及x / 除数加到答案中。
比如 8 / 4 = 2 ···0 那么一定有 8 / 2 = 4 ·····0,所以x(这里是8)得约束成对存在(2和4)对称轴是根号x,即为二倍根号2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void) {
int T;
cin >> T;
while(T--){
int n;
cin >> n;
vector<int> res;
//约数成对存在,只需要循环到根号x
// 不用i * i <= n,因为可能会溢出
for(int i = 1;i<=n/i;i++){
if(n % i == 0)
{
res.push_back(i);
//如果i * i = x,添加i就行了,不需要添加x / i
if(n/i != i)
res.push_back(n/i);
}
}
sort(res.begin(),res.end());
for(auto x : res) cout << x << " ";
cout << endl;
}
}