1062
一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
输入格式:
输入在一行中按 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; } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177708.html原文链接:https://javaforall.net
