A - A+B+C
A,B,C三个有理数写成分子分母为整数的分数的形式,请你计算A+B+C.
Input
输入共T+1行,第一行有一个整数T代表共有T组数据。接下来有T行,每行有3个分数由空格隔开,每个分数的形式都是n/d,n与d均为正整数。
- 1 ≤ T ≤ 103
- 1 ≤ n,d ≤ 106
Output
输出T行,每行输出一个分数,等于对应行的三个分数之和,分数应是最简分数形式。若所求结果是整数,仍要写成分母为1的分数形式。
Example
输入样例
2
1/2 1/3 1/4
3/2 1/2 2/2
输出样例
13/12
3/1
很简单的一道题
三个分数之和为
其中
关键在两点:
1.会求最大公约数和最小公倍数
gcd(a,b)=gcd(b,a mod b) 当b=0时,得到的a就是两者的最大公约数
两个数的最小公倍数=两个数的乘积÷两个数的最大公约数
如果是三个数的话,就将前两个数运算,算出来的结果再和第三个数再算,无论公约数公倍数都一样。
如果是N个数的话?(网上的都好乱 特意去查了算法导论:课后题31.2-8)
gcd(a, b){
if b == 0
return a
return gcd(b, a mod b)
}
lcm(a,b){
return a / gcd(a, b) * b
}
lcm-MULTIPLE(a){
l = a[0]
for i = 1 to a.length
l = lcm(l, a[i])
return l
}
对N个数的数组a,设置一个l,对每个a[i]都做lcm即可。
补充一个有趣的:
如果是大数的话,可以直接:
d[0] = new BigInteger("16");
d[1] = new BigInteger("18");
System.out.println(d[0].gcd(d[1])); //2
2.对“1/2 1/3”这样的数据读取问题
使用C++的话,可以直接scanf("%d/%d %d/%d %d/%d",&a1,&b1,&a2,&b2,&a3,&b3);
使用JAVA的话,麻烦一点,首先很容易想到split分割,题中存在/和空格两种分割,如果两个每次都单独分割的话比较麻烦,最简单的方法就是使用正则,不会的参考http://www.cnblogs.com/Mustr/p/6057159.html
延伸学习:
1.正则的更多种使用方法?加入Pattern和Matcher?关于find()和group()?
2.字符串分割,如何实现String s[][]:
1 2
1 3
1 4
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
long a[] = new long[6];
long up,down;
String s,ss[];
while(n-- !=0) {
s = sc.nextLine();
ss = s.split(" +|/+");
for (int i = 0; i < ss.length; i++) {
a[i] = Long.parseLong(ss[i]);
}
up = a[0]*a[3]*a[5]+a[1]*a[2]*a[5]+a[1]*a[3]*a[4];
down = a[1]*a[3]*a[5];
long maxmul = gcd(up,down);
up /= maxmul;
down /=maxmul;
System.out.println(up+"/"+down);
}
}
static long gcd(long a,long b) { //求a和b的最大公约数
if(b==0) return a;
else return gcd(b,a%b);
}
}
//Pattern p = Pattern.compile("/");
//Matcher match = p.matcher(s);
//while(match.find()) {
arr[i] = Long.parseLong(match.group());
// System.out.println(match.group());
//}