题目描述
输入一个自然数 nn,对于一个最简分数 a/ba/b(分子和分母互质的分数),满足 1≤b≤n,0≤a/b≤1,请找出所有满足条件的分数。
这有一个例子,当 n=5 时,所有解为:
0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
给定一个自然数 nn,请编程按分数值递增的顺序输出所有解。
注:
1、0 和任意自然数的最大公约数就是那个自然数。
2、互质指最大公约数等于1的两个自然数。
输入格式
单独的一行一个自然数 n
输出格式
每个分数单独占一行,按照大小次序排列
输入输出样例
输入 #1
5
输出 #1
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.close();
System.out.println(0 + "/" + 1);
List<Cs> sc = new ArrayList<Cs>(10000);
for (int i = 1; i <= n; i++) {
for (int j = n; j >= 1; j--) {
if (i != j && i < j) {
sc.add(new Cs(i, j));
}
}
}
Collections.sort(sc);
for (Cs cs2 : sc) {
if (gcd(cs2.a, cs2.b) == 1) {
System.out.println(cs2);
}
}
System.out.println(1 + "/" + 1);
}
}
class Cs implements Comparable<Cs> {
int a, b;
double s = 0;
public Cs(int a, int b) {
// TODO Auto-generated constructor stub
this.a = a;
this.b = b;
s = (a * 1.0000) / (b * 1.0000) * 1.0000;
}
@Override
public int compareTo(Cs o) {
// TODO Auto-generated method stub
if (this.s < o.s) {
return -1;
} else if (this.s == o.s) {
return 0;
}
return 1;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return a + "/" + b;
}
}
另外一种方法,很好的
//https://wenku.baidu.com/view/c9258d624a7302768f993944.html
分数数
//分数树的实例讲解
//学习完分数树,那么就可以将这道题目理解为按顺序输出从0到1之间的所有有理数
//这里还要加上附加条件,就是1<=b<=N,0<=a/b<=1,就是说分母必须小于等于输入的n
//然后就是分治法的具体代码了
import java.util.Scanner;
public class Main {
//分治法的具体代码
public static void fenzhi(int n,int a,int b,int c,int d) {
//分母必须小于等于输入的n
if(b+d>n) {
return;
}
fenzhi(n,a,b,a+c,b+d);
System.out.printf("%d/%d\n",a+c,b+d);
fenzhi(n,a+c,b+d,c,d);
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
//从0到1之间的所有有理数(当然还有题目的具体要求得加上附加条件)
int a=0,b=1,c=1,d=1;
System.out.printf("%d/%d\n",0,1);
fenzhi(n,a,b,c,d);
System.out.printf("%d/%d\n",1,1);
}
}