class Main{
public static void main(String[] args){
System.out.println(culculateMinLength("1/5+2/3"));
}
public static String culculateMinLength(String express){
String s[] = express.split("\\+"); //对于‘+’号这里需要用\\转义
String fenShi1[] = s[0].split("/");
String fenShi2[] = s[1].split("/");
int fenZi1 = Integer.parseInt(fenShi1[0]);
int fenMu1 = Integer.parseInt(fenShi1[1]);
int fenZi2 = Integer.parseInt(fenShi2[0]);
int fenMu2 = Integer.parseInt(fenShi2[1]);
//计算分式
int fenMuLcm = lcm(fenMu1, fenMu2);
fenZi1 *= fenMuLcm/fenMu1;
fenZi2 *= fenMuLcm/fenMu2;
//化简分式
int gcd = gcd(fenZi1+fenZi2, fenMuLcm);
int resultFenZi = (fenZi1+fenZi2)/gcd;
int resultFenMu = fenMuLcm/gcd;
//组合结果分式
String resultFenShi = resultFenZi + "/" + resultFenMu;
return resultFenShi;
}
//最大公约数的写法 辗转相除法
public static int gcd(int m,int n){
int temp,r;
//保证m比n大
if(m<n){
temp = m;
m = n;
n = temp;
}
//一直辗转相除 直到余数为0时取除数
while(m%n!=0){
r = m%n;
m = n;
n = r;
}
return n;
}
//最小公倍数 先计算出最大公约数就很容易解决了
public static int lcm(int a,int b){
return a*b/gcd(a, b); // gcd*a/gcd*b/gcd 如12和15的最小公倍数即3*4*5,3为它们的最大公约数
}
}
今天在做CVTE的笔试时,碰到一道编程题,要求写一个方法:方法的输入为字符串(含两个分式的加法),方法返回一个字符串(分式相加的结果,最简分数)。
这道题目考察对字符串的操作(切割),还有对String类型和Integer类型的转换、自动拆箱,以及两个经典算法的实现(求最大公约数和最小公倍数)