对此代码进行优化#include <iostream>#include <vector>using namespace std;// 求最大公约数int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}// 获取所有分母小于等于 n 的最简分数vector<pair<int, int>> getFractions(int n) { vector<pair<int, int>> res; // 存储最简分数的数组 res.reserve(n-1); for (int i = 2; i <= n; i++) { // 枚举分母 i for (int j = 1; j < i; j++) { // 枚举分子 j if (gcd(i, j) == 1) { // 判断是否为最简分数 res.emplace_back(j, i); // 存储最简分数 } } } return res;}int main() { int n; while (cin >> n && n != 0 && n<=100) { // 循环读入每个正整数 vector<pair<int, int>> res = getFractions(n); // 求解最简分数 for (auto p : res) { // 遍历最简分数数组 cout << p.first << "/" << p.second << " "; // 输出最简分数 } cout << endl; } return 0;}
时间: 2024-03-14 10:45:50 浏览: 84
使用include <iostream>时一定要加using namespace std
这段代码的时间复杂度为 $O(n^2 \log n)$,可以通过一些优化来提高效率,例如:
1. 使用辗转相除法计算最大公约数,而不是递归实现的欧几里得算法,可以避免递归带来的开销。
2. 在获取最简分数时,可以使用筛法求解。具体来说,我们可以枚举分母 $i$,然后从 $2i$ 开始,每次加上 $i$,枚举分子 $j$,并判断 $\frac{j}{i}$ 是否为最简分数。这样可以避免重复枚举和重复判断。
优化后的代码如下:
```
#include <iostream>
#include <vector>
using namespace std;
// 求最大公约数
int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
// 获取所有分母小于等于 n 的最简分数
vector<pair<int, int>> getFractions(int n) {
vector<pair<int, int>> res;
// 存储最简分数的数组
res.reserve(n-1);
vector<bool> isPrime(n+1, true);
for (int i = 2; i <= n; i++) {
if (!isPrime[i]) continue;
for (int j = 2 * i; j <= n; j += i) {
isPrime[j] = false;
}
for (int j = i + i; j <= n; j += i) {
if (isPrime[j]) continue;
if (gcd(i, j) == 1) {
res.emplace_back(i, j);
}
}
}
return res;
}
int main() {
int n;
while (cin >> n && n != 0 && n<=100) { // 循环读入每个正整数
vector<pair<int, int>> res = getFractions(n); // 求解最简分数
for (auto p : res) { // 遍历最简分数数组
cout << p.first << "/" << p.second << " "; // 输出最简分数
}
cout << endl;
}
return 0;
}
```
优化后的代码时间复杂度为 $O(n^2)$,可以更快地求解最简分数。
阅读全文