输入一个自然数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
输出为一个列表,每个分数单独占一行,按照实际大小从小到大排列
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//判断是否互质
int isgcd(int x, int y) {
int t;
while (y) {
t = x % y;
x = y;
y = t;
}
return x;
}
int main(){
int n;
scanf("%d",&n);
float a[10000] = {0};
float b[10000] = {0};
int t = 0;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) {
if (isgcdgcd(i, j) == 1) {
t++;
a[t] = j;
b[t] = i;
}
}
}
//排序
for(int i=1;i<=t;i++){
for(int j=i+1;j<=t;j++){
float c = a[i]/b[i]/1.0;
float g = a[j]/b[j]/1.0;
//printf("%.2f %.2f",c,g);
if(c>g){
int t;
t=a[i];
a[i] = a[j];
a[j] = t;
t=b[i];
b[i] = b[j];
b[j] = t;
}
}
}
cout << "0/1" << endl;
for (int i = 1; i <= t; i++) {
cout << a[i] << "/" << b[i] << endl;
}
cout << "1/1" << endl;
return 0;
}