题目链接
题目分析
题目要求是计算N个分数的和。
从控制台读入的数据是分数形式的字符串,所以在运算的时候首先要将分子和分母进行拆分,然后再计算。
计算的总体思路与计算多个整数的和一样,是采用迭代的方式累计进行,但是不同的是,需要同时操作分子和分母,而且要保证在运算的过程中没有发生溢出。所以在每一次计算之前和计算之后都要先对有理数进行约分处理,给运算中可能进行的通分工作节省运算空间。
示例代码
import java.util.Scanner;
public class L1_009 {
static String[] arr;
static long numerator, denominator, num_fenzi, num_fenmu, number;
public static void main(String[] args) {
int n = 0;
Scanner sc = new Scanner(System.in);
//读入要计算的总个数
n = sc.nextInt();
//开辟一个长度为 n 的字符串数组,用来存放读入的有理数
arr = new String[n];
for(int i = 0; i < n; i++) {
arr[i] = sc.next();
}
sc.close();
compute();
getResult();
}
//将有理数的分子和分母分开
public static void change(String s) {
String[] fraction = s.split("/");
numerator = Long.parseLong(fraction[0]);
denominator = Long.parseLong(fraction[1]);
}
//用于计算有理数和的方法
public static void compute() {
//拿到第一个有理数的分子和分母
change(arr[0]);
num_fenzi = numerator;
num_fenmu = denominator;
//首先对分子和分母进行约分
simplify();
long temp = 0;
//以迭代的方式进行计算
for(int i = 1; i < arr.length; i++) {
//拿到即将参与运算的有理数的分子和分母
change(arr[i]);
//同样先进行约分的操作
simplify();
//相加
//不需要通分的情况
if(num_fenmu == denominator) {
num_fenzi += numerator;
}else {
//通分再计算和
temp = num_fenmu;
num_fenmu = num_fenmu * denominator;
num_fenzi = num_fenzi * denominator + numerator * temp;
}
simplify();
//对新求得的和值进行约分
}
}
//约分方法
public static void simplify() {
long a = num_fenzi, b = num_fenmu, m, n = 1;
if(a<b){
m = a;
}
else{
m = b;
}
for(long i = m+1; i>0; i--){
if(a%i==0 && b%i==0){
n = i;
break;
}
}
if(n != 1) {
num_fenzi /= n;
num_fenmu /= n;
}
}
//求得最终得结果形式的方法
public static void getResult() {
//分子为零的时候直接输出零
if(num_fenzi == 0) {
System.out.println("0");
return;
}
//是否是带分数
number = num_fenzi / num_fenmu;
if(number == 0) {
System.out.println(num_fenzi + "/" + num_fenmu);
}else {
num_fenzi %= num_fenmu;
if(num_fenzi == 0) {
System.out.println(number);
}else {
System.out.println(number + " " + num_fenzi + "/" + num_fenmu);
}
}
}
}