zoukankan      html  css  js  c++  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
    ", sum, fm2);
                    } else {
                        System.out.printf("%d/%d
    ", 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
    ", 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
    ", 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);
            }
        }
    }
  • 相关阅读:
    scss的初级学习随笔小计
    trimpash实现jd选项卡首次输入
    透明度动画
    js原生动画一匀速动画
    filter滤镜的使用
    scss实现不同方向的三角
    模板方法模式-考题抄错,会做也白搭
    设计模式概述
    mysql数据库
    夜饮东坡醒复醉
  • 原文地址:https://www.cnblogs.com/huangZ-H/p/10066422.html
Copyright © 2011-2022 走看看