您的位置:首页 > 其它

天梯赛 L1-009. N个数求和

2018-03-25 19:11 197 查看
/*7-1 N个数求和(20 分)
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,
你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。
题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,
要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。*/

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
;  
        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]);  
            }  
        }  
        for(int i=0 ;i<n ;i++){  
            sum += getfz(s[i])*fm2/getfm(s[i]);   
        }  
          
        大致分类 
         * ① 分母等于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);  
        }  
    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: