#include <bits/stdc++.h> using namespace std; const int N = 100010; int a[N], p[N], p1[N]; bool cmp(int x, int y) { return x > y; } int main() { int n; cin >> n; int t = 0; for (int i = 2; i <= n; i++) { if (n % i == 0) { a[t++] = i; } } int w = 0; for (int i = 0; i < t - 1; i++) { if (a[i + 1] - a[i] == 1) { p[w]++; } else { w++; } } sort(p, p + w, cmp); int pm = p[0], g = 0, d = 0; for (int i = 0; i < t - 1; i++) { if (a[i + 1] - a[i] == 1) { p1[g]++; } else { g++; } if (p1[g] == pm) { d = i; break; } } cout << pm + 1 << endl; for (int i = 0; i <= pm; i++) { cout << a[d - pm + i + 1]; if (i < pm) { cout << "*"; } else { cout << endl; } } return 0; }解决时间超限的完整代码
时间: 2024-01-09 11:06:09 浏览: 156
这段代码的作用是找出一个正整数 n 的所有正因子,然后找出相邻两个正因子之差为 1 的连续因子序列中,长度最长的那个序列,并输出该序列的长度和所有因子的乘积,中间用 * 隔开。
代码中存在一些可以优化的地方,比如可以用 sqrt(n) 替代 n 作为循环上界,可以将判断 a[i+1]-a[i]==1 的操作移到循环内部,避免重复遍历数组等等。
但是,这段代码的时间复杂度为 O(nlogn),当 n 较大时,时间会超限。因此需要对代码进行优化。
一种优化思路是,先将 n 分解质因数,然后根据质因数的组合方式,计算出所有的因子。这样可以避免枚举所有的数,从而降低时间复杂度。
下面是一种时间复杂度为 O(sqrt(n)) 的实现方式:
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> primes; // 质因数
for (int i = 2; i <= sqrt(n); ++i) {
while (n % i == 0) {
primes.push_back(i);
n /= i;
}
}
if (n > 1) primes.push_back(n);
int len = primes.size();
vector<int> divisors; // 所有因子
for (int i = 1; i < (1 << len); ++i) {
int div = 1;
for (int j = 0; j < len; ++j) {
if (i & (1 << j)) div *= primes[j];
}
divisors.push_back(div);
}
sort(divisors.begin(), divisors.end());
int max_len = 0, max_idx = -1;
for (int i = 1; i < divisors.size(); ++i) {
if (divisors[i] - divisors[i-1] == 1) {
int len = 2;
for (int j = i+1; j < divisors.size(); ++j) {
if (divisors[j] - divisors[j-1] == 1) {
++len;
} else {
break;
}
}
if (len > max_len) {
max_len = len;
max_idx = i-1;
}
}
}
cout << max_len << endl;
for (int i = max_idx; i < max_idx+max_len; ++i) {
cout << divisors[i];
if (i < max_idx+max_len-1) cout << "*";
}
cout << endl;
return 0;
}
```
阅读全文