java P1458 顺序的分数 Ordered Fractions

题目描述
输入一个自然数 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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值