坑很多的一道题(含测试样例)——L1-009 N个数求和 (20分)

L1-009 N个数求和 (20分)

本题的要求很简单,就是求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

我的解决办法:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		
		scanner.nextLine();
		int a, b;
		
		String[] split = scanner.nextLine().split(" ");
		String s = split[0];
		a = Integer.parseInt(s.substring(0, s.indexOf('/')));
		b = Integer.parseInt(s.substring(s.indexOf('/') + 1));
		int x, y, common;
		
		common = gcd(a, b);
		a /= common;
		b /= common;
		
		for (int i = 1; i < n; i++) {
			s = split[i];
			x = Integer.parseInt(s.substring(0, s.indexOf('/')));
			y = Integer.parseInt(s.substring(s.indexOf('/') + 1));
			
			common = y * b / gcd(y, b);
			
			a *= common / b;
			x *= common / y;

			a += x;
			b = common;
			
			common = gcd(a, b);
			a /= common;
			b /= common;
			
		}
		
		if(a / b != 0) {
			if(a % b != 0) 
				System.out.println(a / b + " " + a % b + "/" + b);
			else
				System.out.println(a / b);
		} else {
			if(a % b != 0) 
				System.out.println(a % b + "/" + b);
			else
				System.out.println(0);
		}
	}
	
	private static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b); 
	}
}

我找到的测试样例

输入样例
1
-50/1000
输出样例
-1/20
输入样例
1
-6/4
输出样例
-1  1/-2
输入样例
2
0/1 0/2 
输出样例
0
输入样例
2
0/1 2/4
输出样例
1/2
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页