代码
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n;
void get_divisors(int n)
{
vector<int> res;
for (int i = 1; i <= n / i; i++) {
if (n % i == 0) {
res.push_back(i);
if (i != n / i) { // 避免 i==n/i, 重复放入 (n是完全平方数
res.push_back(n / i);
}
}
}
sort(res.begin(), res.end());
for (auto item : res) {
cout << item << " ";
}
puts("");
}
int main()
{
cin >> n;
while (n--) {
int x;
cin >> x;
get_divisors(x);
}
return 0;
}
很不明白为什么这里要开vector 而求质数,质因数却不用开vector,到底有什么差别
vector可以sort()
好的谢谢
那用数组不是也一样吗?
不好意思,本人当时才疏学浅回复有误,应该是动态数组方便尾插和遍历,开数组和idx指针然后随着元素插入idx++也可以达到类似的效果。
酱紫谦虚
i*i<=n 不行吗?
一定要写成i<=n/i;
这题里面是可以的, 这样写的好处是保证 i*i 不会溢出, 是一种习惯写法
视频有讲,ii可能满足小于n但是当i再加1 ii不仅大于n而且直接超出了最大存储,这是有可能的
for (auto item : res) {
cout << item << ” “;
为什么要这样输出?不能直接输出
可以少写一点代码…
我已经知道了,谢谢
就是一个遍历数组辣
也可以写成:
谢啦
基础不太好,避免重复输出那,为什么放入res队尾就可以避免了呢?
我觉得重复放入跟
vector<int> res
没啥关系,应该是if (i != n / i)
这个if特判有关系这是我的 个人理解自己代数算算就懂了
排序耗时间,有不用排序的算法
不用排序吧
我这种写法是需要的,看具体写法
借个图~
为啥你有算法进阶指南的PDF?
群友发的
感谢指正!
这是一本什么书呀,感觉挺详细
算法竞赛进阶指南
谢啦,现在对一些数学推论还不是很了解,数论这几节听的不太懂,感觉这本书会有一些帮助