L1-009 N个数求和
本题的要求很简单,就是求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
实现代码
package com.misakora.home.hooo.l1_009;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
try {
int n = Integer.parseInt(bf.readLine()); // 输入 有多少个分数
String[] strings = bf.readLine().split(" "); // 输入 分数 , 并处理成字符串数组
int[] denominators = new int[n], //存储分母
molecules = new int[n]; //存储分子
String[] temp; //临时变量
for (int i = 0; i < n; i++) {
//把分数的分子分母分开 存入 denominators数组 和molecules数组
temp = strings[i].split("/");
molecules[i] = Integer.parseInt(temp[0]);
denominators[i] = Integer.parseInt(temp[1]);
}
//接下来,要分母同步 先找出最大的分母
int maxDenominators = maxValInArray(denominators);//返回数组中最大的公倍数
//同步分母和分子
int mol = 0 ;//存储倍数
for (int i = 0; i < n; i++) {
mol = maxDenominators/denominators[i];
molecules[i] *= mol; // 分子同步
}
//分子相加
int sum = sumArray(molecules); //数组求和函数
//计算整数部分
int intpp = sum / maxDenominators;
//分数部分
int score = sum % maxDenominators;
//输出
//整数部分
if (intpp != 0){
System.out.print(intpp);
System.out.print(" ");
}
//分数部分
if (score != 0){
int maxDivisor = gcd(score ,maxDenominators); // 求最大公约数
score /= maxDivisor;// 最大公约数
maxDenominators /= maxDivisor;
System.out.print(score+"/"+maxDenominators);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 返回数组中最大的公分母
* @param array
* @return int
*/
public static int maxValInArray(int[] array){
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (max % array[i] == 0 || array[i] % max == 0){
max = Math.max(max , array[i]);
}else{
max *= array[i];
}
}
return max;
}
/**
* 整个数组值的和
* @param array
* @return int
*/
public static int sumArray(int[] array){
int sum=0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}
/**
* 求最大公约数, 已知 mol < den
* @param mol
* @param den
* @return
*/
public static int gcd(int mol , int den){
int r = den % mol;
while (r>0){
den = mol;
mol = r;
r = den % mol;
}
return mol;
}
}