1. 程式人生 > >2018/12/04 PAT刷題 L1-009 N個數求和 java

2018/12/04 PAT刷題 L1-009 N個數求和 java

看了好久的程式碼, 終於看懂了:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] s = new String[n];
        long fm2 = 1;
        long sum = 0;
        s[0] = sc.next();
        
for (int i = 1; i < n; i++) { s[i] = sc.next(); if (fm2 % getfm(s[i]) != 0) { // 防止直接分母全部相乘超範圍 fm2 *= getfm(s[i]); // 如果原來初始化為1的分母變數fm2 不能整除 下一個數s[i]的分母, 那麼就將s[i]的分母乘以fm2, 更新分母變數 } } sc.close(); for (int i = 0; i < n; i++) { sum
+= getfz(s[i]) * fm2 / getfm(s[i]); } // sum是兩個分母的最大公約數 /* * 大致分類 ① 分母等於0 ②分子(絕對值)小於分母 包括正數和負數 ③分子等於分母 ④分子(絕對值)大於分母 包括正數和負數 第④種情況就涉及到帶分數 */ if (sum == 0) { System.out.println(0); } else { if (Math.abs(sum) < fm2) {
if (gcd(sum, fm2) == 1) { System.out.printf("%d/%d\n", sum, fm2); } else { System.out.printf("%d/%d\n", sum / gcd(sum, fm2), fm2 / gcd(sum, fm2)); } } else if (Math.abs(sum) == fm2) { if (sum < 0) { System.out.println(-1); } else { System.out.println(1); } } else { if (sum < 0) { sum = -sum; long x = sum / fm2; if (sum % fm2 != 0) { System.out.printf("-%d -%d/%d\n", x, ((sum - fm2 * x) / gcd((sum - fm2 * x), fm2)), (fm2 / gcd((sum - fm2 * x), fm2))); // 分子分母同時除以最大公倍數 } else { System.out.println(-x); } } else { long x = sum / fm2; if (sum % fm2 != 0) { System.out.printf("%d %d/%d\n", x, ((sum - fm2 * x) / gcd((sum - fm2 * x), fm2)), (fm2 / gcd((sum - fm2 * x), fm2))); // 分子分母同時除以最大公倍數 } else { System.out.println(x); } } } } } public static long getfz(String s) { String[] s1 = s.split("/"); return Long.parseLong(s1[0]); } public static long getfm(String s) { String[] s1 = s.split("/"); return Long.parseLong(s1[1]); } public static long gcd(long a, long b) { // 求最大公約數 if (a < 0) { a = -a; } if (b < 0) { b = -b; } if (a < b) { long temp = a; a = b; b = temp; } if (a % b == 0) { return b; } else { return gcd(b, a % b); } } }