A+B+C  Gym - 101917G JAVA

92 篇文章 0 订阅
75 篇文章 0 订阅

A - A+B+C

 Gym - 101917G 

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());
//}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值