团体程序设计天梯赛-练习集 L1-009 N个数求和
题目描述:
L1-009 N个数求和 (20 分)
本题的要求很简单,就是求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
难点分析:
主要难点在对分母进行通分,而通分要求出最小公倍数,最小公倍数又要求出最大公因数
求最大公因数和最小公倍数:
- 辗转相除法求最大公因数
int gcd(int a,int b) {
if(a==0)
return 1;
else if(b==0) {
return a;
}else {
return gcd(b,a%b);
}
}
- 公式法求最小公倍数
a和b的最小公倍数=a*b/(a和b的最大公因数)
代码题解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int size = scan.nextInt();
MyNum num1 = new MyNum();
num1.setNum(scan.next());
num1.simple();
String nextLine = scan.nextLine();
String[] split = nextLine.split(" ");
//将num1作为最后输出的结果,将其他数都加给num1
for (int i = 1; i < size; i++) {
MyNum num2 = new MyNum();
num2.setNum(split[i]);
num2.simple();
num1.add(num2);
}
//分情况输出结果
if(num1.fenmu == 1) {
System.out.println(num1.fenzi);
}else if(num1.fenzi>num1.fenmu) {
int n = num1.fenzi/num1.fenmu;
System.out.printf("%d %d/%d",n,num1.fenzi-n*num1.fenmu,num1.fenmu);
}
else {
System.out.printf("%d/%d",num1.fenzi,num1.fenmu);
}
scan.close();
}
}
class MyNum{
int fenzi;
int fenmu;
//int fuhao;//0 + 1 -
//辗转相除法求最大公因数
int gcd(int a,int b) {
if(a==0)
return 1;
else if(b==0) {
return a;
}else {
return gcd(b,a%b);
}
}
//对分子和分母进行赋值
public void setNum(String string) {
String[] split1 = string.split("/");
this.fenzi = Integer.parseInt(split1[0]);
this.fenmu = Integer.parseInt(split1[1]);
}
//两个分数间的加法
public void add(MyNum num2) {
int maxInner = gcd(this.fenmu,num2.fenmu);
int minR = this.fenmu * num2.fenmu / maxInner;
this.fenzi = this.fenzi * (minR/this.fenmu) + num2.fenzi * (minR/num2.fenmu);
this.fenmu = minR;
this.simple();
}
//对分子分母进行通分
public void simple() {
int maxInner = gcd(this.fenmu,this.fenzi);
this.fenzi /= maxInner;
this.fenmu /= maxInner;
}
}