题目简介:
本题的要求很简单,就是求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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题的巧妙方法:用class类的属性来记录分母和分子并进行相关相加操作。
难点:
1.在将数据存入类中时先进行数的化简,怎么求分子和分母的通分。
2.化简后的数的相加(求出两个分数分母的最小公倍数)。
代码实现:
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());与后面的scan.nextLine连用
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;
}
}