PAT团队程序设计天梯赛-习题集L1-009 N个数求和

题目链接

点击打开题目链接

题目分析

题目要求是计算N个分数的和。

从控制台读入的数据是分数形式的字符串,所以在运算的时候首先要将分子和分母进行拆分,然后再计算。

计算的总体思路与计算多个整数的和一样,是采用迭代的方式累计进行,但是不同的是,需要同时操作分子和分母,而且要保证在运算的过程中没有发生溢出。所以在每一次计算之前和计算之后都要先对有理数进行约分处理,给运算中可能进行的通分工作节省运算空间。

示例代码

import java.util.Scanner;
public class L1_009 {
	static String[] arr;
	static long numerator, denominator, num_fenzi, num_fenmu, number;
	public static void main(String[] args) {
		int n = 0;
		Scanner sc = new Scanner(System.in);
		//读入要计算的总个数
		n = sc.nextInt();
		//开辟一个长度为 n 的字符串数组,用来存放读入的有理数
		arr = new String[n];
		for(int i = 0; i < n; i++) {
			arr[i] = sc.next();
		}
		sc.close();
		compute();
		getResult();
	}
	//将有理数的分子和分母分开
	public static void change(String s) {
		String[] fraction = s.split("/");
		numerator = Long.parseLong(fraction[0]);
		denominator = Long.parseLong(fraction[1]);
	}
	//用于计算有理数和的方法
	public static void compute() {
		//拿到第一个有理数的分子和分母
		change(arr[0]);
		num_fenzi = numerator;
		num_fenmu = denominator;
		//首先对分子和分母进行约分
		simplify();
		long temp = 0;
		//以迭代的方式进行计算
		for(int i = 1; i < arr.length; i++) {
			//拿到即将参与运算的有理数的分子和分母
			change(arr[i]);
			//同样先进行约分的操作
			simplify();
			//相加
			//不需要通分的情况
			if(num_fenmu == denominator) {
				num_fenzi += numerator;
			}else {
				//通分再计算和
				temp = num_fenmu;
				num_fenmu = num_fenmu * denominator;
				num_fenzi = num_fenzi * denominator + numerator * temp;
			}
			simplify();
			//对新求得的和值进行约分
		}
	}
	//约分方法
	public static void simplify() {
		long a = num_fenzi, b = num_fenmu, m, n = 1;
		if(a<b){
			m = a;
		}
		else{
			m = b;
		}
		for(long i = m+1; i>0; i--){
			if(a%i==0 && b%i==0){
				n = i;
				break; 
			}
		}
		if(n != 1) {
			num_fenzi /= n;
			num_fenmu /= n;
		}
	}
	//求得最终得结果形式的方法
	public static void getResult() {
		//分子为零的时候直接输出零
		if(num_fenzi == 0) {
			System.out.println("0");
			return;
		}
		//是否是带分数
		number = num_fenzi / num_fenmu;
		if(number == 0) {
			System.out.println(num_fenzi + "/" + num_fenmu);
		}else {
			num_fenzi %= num_fenmu;
			if(num_fenzi == 0) {
				System.out.println(number);
			}else {
				System.out.println(number + " " + num_fenzi + "/" + num_fenmu);
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值