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;
}
}