#include <iostream> #include<math.h>//用一下sqrt using namespace std; #define int long long // 将 int 替换为 long long,n的最大值会爆int const int N = 1e6 + 17; // 根据需求调整大小 bool st[N];//用于检测是否为质数 int pri[N], idx;//用于存储质数 int cnt[N];//用于存储质数的个数比如180中2个2,那pri[1]=2,cnt[1]=2; void get_pri(int n) {//先求质数 for (int i = 2; i <= sqrt(n)+10; i++) {//用sqrt提高效率,就不全部遍历了。 if (!st[i]) { pri[++idx] = i; int res = 0; while (n % i == 0) {//找该质数对应个数 n /= i; res++; } cnt[idx] = res; } for (int j = 1; j <= idx && pri[j] <= n / i; j++) { st[i * pri[j]] = true; if (i % pri[j] == 0) break; } if (i * i > n) break; // 提前退出循环 } if (n > 1) { // 如果 n 是质数 pri[++idx] = n; cnt[idx] = 1; } } signed main() { // 使用 signed 代替 int,因为 int 已被替换为 long long int n = 0; cin >> n; get_pri(n); for (int i = 1; i <= idx; i++) {//遍历,输出。 for (int j = 0; j < cnt[i]; j++) { cout << pri[i] << ' '; } } return 0; }