c++一个整数n(1<n<=100),返回所有0到1之间(不包括 0和1)满足分母小于等于n的最简分数,分数可以以任意顺序返回。请设计算法,用结构化程序设计方法编程验证算法的正确性。 输入格式: 输入若干个正整数,最后以0结束,输入数据之间由一个空格分隔。 输出格式: 每行输出对应输入中每个整数对应的计算结果,每个最简分数之间以空格符隔开。 以快速简便的算法进行目标整数的最简分数的计算。 样例输入: 2 4 0 样例输出: 1/2 1/2 1/3 1/4 2/3 3/4
时间: 2024-03-16 08:44:06 浏览: 90
算出从n个不同元素中取出m个元素(m≤n)的组合数——C语言代码
以下是C++的代码实现,使用了辗转相除法求最大公约数,然后根据最大公约数化简分数:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 辗转相除法求最大公约数
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
// 将分数化简为最简分数
pair<int, int> simplify(int a, int b) {
int g = gcd(a, b);
return {a / g, b / g};
}
int main() {
int n;
while (cin >> n && n != 0) {
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);
}
}
}
sort(fractions.begin(), fractions.end(), [](auto& a, auto& b) {
return a.first * b.second < b.first * a.second;
});
for (auto& frac : fractions) {
auto [a, b] = simplify(frac.first, frac.second);
cout << a << "/" << b << " ";
}
cout << endl;
}
return 0;
}
```
算法流程如下:
- 对于输入的每个整数n,遍历分母为1到n-1的所有分数,找到分子分母互质的分数,加入到vector中。
- 对vector中的所有分数按照分数值从小到大排序。
- 对vector中的每个分数调用simplify函数进行化简,输出结果。
对于样例输入2和4,程序输出的结果符合要求。
阅读全文