本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(<=100)。随后一行按格式“a1/b1 a2/b2 ...”给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成“整数部分 分数部分”,其中分数部分写成“分子/分母”,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
程序代码:
import java.util.Scanner;
public class L1009 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
long sumt = 0,sumb = 1;
long gcd = 1;
while(N-- > 0) {
String temp = sc.next();
String[] s = temp.split("\\/");
long top = Long.valueOf(s[0]);
long bottom = Long.valueOf(s[1]);
sumt = bottom * sumt + top * sumb;
sumb = bottom * sumb;
if(sumt != 0) {
if(Math.abs(sumt) < sumb)
gcd = gcd(sumb,Math.abs(sumt));
else
gcd = gcd(Math.abs(sumt),sumb);
sumt = sumt / gcd;
sumb = sumb / gcd;
}
}
long integer = sumt / sumb;
String rest = String.valueOf(sumt % sumb) + "/" + String.valueOf(sumb);
if(integer == 0 && sumt % sumb != 0)
System.out.println(rest);
else if(sumt % sumb == 0)
System.out.println(integer);
else
System.out.println(integer + " " + rest);
}
public static long gcd(long num1,long num2) {
if(num1 % num2 == 0)
return num2;
else
return gcd(num2,num1 % num2);
}
}