问题描述 :
输入一个自然数N,请写一个程序来增序输出分母小于等于N的既约真分数(即无法再进行约分的小于1的分数)
输入说明 :
单独的一行,一个自然数N(1…20)
输出说明 :
每个分数单独占一行
按照分数大小升序排列
对于分子为0的分数,仅输出0/1,不输出其它分母的分数,比如0/2, 0/3。
输入范例 :
4
输出范例 :
0/1
1/4
1/3
1/2
2/3
3/4
完整C++代码
辗转相除法左右互搏
#include <bits/stdc++.h>
using namespace std;
struct node {
int l, r;
};
bool cmp(node a, node b) {
return a.l * b.r < a.r * b.l;
}
int gcd(int n, int m) {
if (n % m == 0) return m;
return gcd(m, n % m);
}
int main()
{
int n;
cin >> n;
vector<node> v;
node t;
t.l = 0;
t.r = 1;
v.push_back(t);
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
if (gcd(i, j) != 1) continue;
t.r = i;
t.l = j;
v.push_back(t);
}
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size(); i++) {
cout << v[i].l << '/' << v[i].r << endl;
}
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋