对上述代码进行详细讲解
时间: 2024-03-16 18:44:07 浏览: 115
好的,对代码进行详细讲解。
首先,程序读入一个整数n,表示要求分母小于等于n的最简分数。如果n为0,则退出程序。这个部分的代码如下:
```cpp
int n;
while (cin >> n && n != 0) {
// ...
}
```
接着,程序遍历分母为1到n-1的所有分数,找到分子分母互质的分数,加入到vector中。这个部分的代码如下:
```cpp
vector<pair<int, int>> fractions;
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
if (gcd(i, j) == 1) {
fractions.emplace_back(i, j);
}
}
}
```
这里使用了一个pair<int, int>类型的vector来存储所有的分数,pair的第一个元素表示分子,第二个元素表示分母。外层循环遍历所有的分母为1到n-1的分数,内层循环遍历所有的分母为i+1到n的分数。如果分子分母互质,则将其加入到vector中。
判断分子分母是否互质的函数gcd可以使用辗转相除法实现。这个函数的代码如下:
```cpp
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
```
接下来,程序对vector中的所有分数按照分数值从小到大排序。这个部分的代码如下:
```cpp
sort(fractions.begin(), fractions.end(), [](auto& a, auto& b) {
return a.first * b.second < b.first * a.second;
});
```
这里使用了C++11的lambda表达式来定义比较函数。lambda表达式的形式是[捕获列表](参数列表) -> 返回值类型 { 函数体 }。这里的捕获列表为空,参数列表包含两个引用类型的参数a和b,返回值类型为bool。函数体中使用了分数的大小比较规则,即a.first/a.second < b.first/b.second等价于a.first * b.second < b.first * a.second。
最后,程序对vector中的每个分数调用simplify函数进行化简,输出结果。这个部分的代码如下:
```cpp
for (auto& frac : fractions) {
auto [a, b] = simplify(frac.first, frac.second);
cout << a << "/" << b << " ";
}
cout << endl;
```
这里使用了C++17的结构化绑定语法,在auto后面使用中括号[]来定义变量名,然后使用等号=将simplify函数返回的pair<int, int>类型的结果分别赋值给a和b。最后,程序输出化简后的分数,每个分数之间使用空格隔开,末尾再输出一个换行符。
simplify函数的实现很简单,就是对分子分母同时除以它们的最大公约数。这个函数的代码如下:
```cpp
pair<int, int> simplify(int a, int b) {
int g = gcd(a, b);
return {a / g, b / g};
}
```
至此,代码讲解完毕。
阅读全文