PTA 程序设计天梯赛 Java L1-009 N个数求和 (20分)

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37079157/article/details/109271201