PTA乙级1062

1062

一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。

现给定两个不相等的正分数 N
​1
​​ /M
​1
​​ 和 N
​2
​​ /M
​2
​​ ,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。

输入格式:

输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。

输出格式:

在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。

输入样例:

7/18 13/20 12

输出样例:

5/12 7/12

思路:我的想法是得到分子分母,然后根据题目要求是要从小到大,那就先让要比较的两个分数先从小到大排列,然后在与num/k通分的情况下让num/k在两分数之间变化,因为题目要求的是结果以分母为k,所以就直接变化num就行了从,num1开始增加用while循环进行判断,当num与k的最大公约数为1的时候且在指定范围内则满足要求直接输出,这里部分代码我参考了大佬的,但是不是很懂printf("%s%d/%d", flag == true ? " " : "", num, k);其中的flag是个什么用法所以就没有引用还是以最古老的方式输出.
代码:

package PTA2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PTA1062 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        String[] sm = s[0].split("/");
        int n1 = Integer.parseInt(sm[0]), m1 = Integer.parseInt(sm[1]);//第一个分母和分子
        String[] bi = s[1].split("/");
        int n2 = Integer.parseInt(bi[0]), m2 = Integer.parseInt(bi[1]);//第二个分母和分子
        int k = Integer.parseInt(s[2]);
        if(n1 * m2 > n2 * m1) {//替换一下位置使其从小到大方便后面使用
            int temp = n1;
            n1 = n2;
            n2 = temp;
            temp = m1;
            m1 = m2;
            m2 = temp;
        }
        int num = 1;//这是num/k中的num,num为分子
        while(n1 * k >= m1 * num) {//使num/k比/n1/m1大获得num的值
            num++;
        }
        while(n1 * k < m1 * num && m2 * num < n2 * k) {//在num/k比n2/m2小的情况下增加num的值,当k与num的最大公约为1时获得一个题目要求的分数,同时能保证从小到大输出
            if(gcd(k, num) == 1) {
                System.out.print(num+"/"+k+" ");
            }
            num++;
        }
    }
    private static int gcd(int a, int b){//求最大公约数
        int t=0;
        while (a%b!=0){
            t=a%b;
            a=b;
            b=t;
        }
        return b;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值