本题的要求很简单,就是求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.math.BigDecimal;
import java.util.Scanner;
public class Main {
static long[] sums(long []a,long []b){
long m1=a[0];
long m2=a[1];
long m3=b[0];
long m4=b[1];
if(m1==0)
return b;
long fz=m1*m4+m2*m3;
long fm=m2*m4;
a[0]=fz;
a[1]=fm;
return yuefen(a);
}
static long[] yuefen(long[]str){
long n1=str[0];
long n2=str[1];
int flag=1;
if(n1<0){
n1=-n1;
flag=0;
}
long gcd=1;
long i=n1;
long j=n2;//求公因数
while(true){
if(i%j==0){
gcd=j;
break;
}
else if(j%i==0){
gcd=i;
break;
}
else if(i>j){
i=i%j;
}
else {
j=j%i;
}
}
n1=n1/gcd;
n2=n2/gcd;
if(flag==0)
n1=-n1;
str[0]=n1;
str[1]=n2;
return str;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
String cin=scanner.next();
String []first=cin.split("/");
long l1=new BigDecimal(first[0]).longValue();
long l2=new BigDecimal(first[1]).longValue();
long []re={l1,l2};
for(int i=1;i<n;i++){
String cin2=scanner.next();
String []str=cin2.split("/");
long l3=new BigDecimal(str[0]).longValue();
long l4=new BigDecimal(str[1]).longValue();
long []ad={l3,l4};
re=sums(re, ad);
}
long r1=re[0];
long r2=re[1];
if(r1>0){
if(r1<r2)
System.out.print(r1+"/"+r2);
if(r1>r2&&r2>0){
if(r1%r2==0)
System.out.print(r1/r2);
else {
System.out.print(r1/r2+" "+r1%r2+"/"+r2);
}
}
}
else if(r1<0){
r1=-r1;
if(r1<r2)
System.out.print("-"+r1+"/"+r2);
if(r1>r2&&r1>0&&r2>0){
if(r1%r2==0)
System.out.print("-"+r1/r2);
else {
System.out.print("-"+r1/r2+" "+"-"+r1%r2+"/"+r2);
}
}
}
else if(r1==0){
System.out.print(0);
}
}
}