输入一个自然数N,我们总可以得到一些满足“1≤b≤N,0≤a/b≤1”条件的最简分数a/b(分子和分母互质的分数),请找出所有满足条件的分数。
比方说,当N=5时,所有解为:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
现在,你需要对于一个给定的自然数N,1≤N≤160,请编程按分数值递增的顺序输出所有解。
注:0和任意自然数的最大公约数就是那个自然数、互质指最大公约数等于1的两个自然数。
输入包括一个给个给定的自然数N
输出为一个列表,每个分数单独占一行,按照实际大小从小到大排列
样例1
输入:
5
输出:
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
#include <iostream>
using namespace std;
int gcd(int x, int y) {
int t;
while (y) {
t = x % y;
x = y;
y = t;
}
return x;
}
int main(int argc, char **argv) {
int n;
cin >> n;
int a[10000] = { 0 };
int b[10000] = { 0 };
int t = 0;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) {
if (gcd(i, j) == 1) {
t++;
a[t] = j;
b[t] = i;
}
}
}
for (int i = 1; i <= t - 1; i++) {
for (int j = i + 1; j <= t - 1; j++) {
if (a[i] * b[j] > a[j] * b[i]) {
int k;
k = a[i];
a[i] = a[j];
a[j] = k;
k = b[i];
b[i] = b[j];
b[j] = k;
}
}
}
cout << "0/1" << endl;
for (int i = 1; i <= t; i++) {
cout << a[i] << "/" << b[i] << endl;
}
cout << "1/1" << endl;
return 0;
}