本题思路以及坑:
思路:
将两个分数的分母变成所给三个分母的公倍数,然后再除以另外两个分母来得到转化为所需要输出的分母为底的分数,再对中间的数进行判断是否分子分母能够约即可。
坑:
①输入的顺序不一定是从小到大。
②当输入的三个分母有两个或者三个相同时,要保证两个边界不会被输出。
1.题目如下:
一个分数一般写成两个整数相除的形式: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
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
2.代码如下:
package pat_1062;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class testPractice1062 {
public static void main(String[] args) {
try {
BufferedReader bf1=new BufferedReader(new InputStreamReader(System.in));
String str1=bf1.readLine();
String num1=str1.split(" ")[0];
String num2=str1.split(" ")[1];
int newDenominator =Integer.parseInt(str1.split(" ")[2]);
Double molecule1=Double.parseDouble(num1.split("[/]")[0]);
Double molecule2=Double.parseDouble(num2.split("[/]")[0]);
Double denominator1=Double.parseDouble(num1.split("[/]")[1]);
Double denominator2=Double.parseDouble(num2.split("[/]")[1]);
Double low=molecule1*denominator2*newDenominator;
Double high=molecule2*denominator1*newDenominator;
//System.out.println(low+" "+high);
//得到的是两个分数以新分母为底之后的大小分子
Double lowMolecule=low/(denominator1*denominator2);
Double highMolecule=high/(denominator1*denominator2);
//System.out.printf("%.2f %.2f\n",lowMolecule,highMolecule);
int newLowMolecule;
int newHighMolecule;
if(lowMolecule<highMolecule) {
newLowMolecule =(int)(lowMolecule+1);
//System.out.println(newLowMolecule);
newHighMolecule =(int)(highMolecule-0);
}
else {
newLowMolecule =(int)(highMolecule+1);
//System.out.println(newLowMolecule);
newHighMolecule =(int)(lowMolecule-0);
}
//System.out.println(newLowMolecule+" "+newHighMolecule);
ArrayList<String> answer=new ArrayList<String>();
/*由于边界的两个数不能够打印出来
* 所以当新分母和大分数的分母相同时,要省略掉这个数,
* 因为此时分母不变
* 而小数因为+1,所以肯定不会是边界
*/
if(newDenominator==denominator2) {
for(int i=newLowMolecule;i<newHighMolecule;i++) {
if(publicFactor(i,newDenominator)==1) {
answer.add(i+"/"+newDenominator);
}
}
}
else {
for(int i=newLowMolecule;i<=newHighMolecule;i++) {
if(publicFactor(i,newDenominator)==1) {
answer.add(i+"/"+newDenominator);
}
}
}
for(int i=0;i<answer.size();i++) {
System.out.print(answer.get(i));
if(i!=answer.size()-1) {
System.out.print(" ");
}
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
public static int publicFactor(int a,int b) {
if(b%a==0) {
return a;
}
else {
return publicFactor(b%a,a);
}
}
}