题目链接
题目分析
题目要求是计算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); } } } }