题解 | #质数因子#
质数因子
https://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607
#include <algorithm> #include <cmath> #include <iostream> #include <vector> using namespace std; unsigned int ret_zhishu(unsigned int& zhishu); bool panduan(unsigned int); int main() { unsigned int num; cin >> num; vector<unsigned int> arr; unsigned int zhishu = 2; // 先判断这个数是否为质数,如果是,那么质因子只有他自己,可以降低时间复杂度 if (panduan(num)) { arr.push_back(num); } else { /* 这个地方,上限设置为这个数的开方 好处: 能够降低时间复杂度 如果该数字除以较小的质因子后的结果是个大质数,那么不会重复放进去 因为到不了另一边 */ for (int i = 0; i <= sqrt(num); ++i) { // 先看能不能直接除,不能就在求下一个质数再继续除 if (num % zhishu == 0) { num /= zhishu; if (panduan(num) && num != 1) { arr.push_back(num); } // 有些数会重复放入,思考如何解决 arr.push_back(zhishu); // 除完当前质数,看看数字有没有变成1,变成了就结束 if (1 == num) { break; } } else { // 获取下一个质数 zhishu = ret_zhishu(zhishu); } } } vector<unsigned int>::iterator iter; sort(arr.begin(), arr.end()); for (iter = arr.begin(); iter != arr.end(); ++iter) { cout << *iter << ' '; } } // 判断当前数是否为质数 bool panduan(unsigned int zhishu) { bool flag = true; for (int j = 2; j < sqrt(zhishu) + 1; j++) { if (zhishu % j == 0) { flag = false; break; } } return flag; } // 获取下一个质数 unsigned int ret_zhishu(unsigned int& zhishu) { bool flag = true; while (1) { ++zhishu; flag = panduan(zhishu); if (flag) { return zhishu; } } } // 64 位输出请用 printf("%lld")