坑很多的一道題(含測試樣例)——L1-009 N個數求和 (20分)

愛出bug的程式碼小白發表於2020-10-26

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

相關文章