L1-009. N个数求和

本题的要求很简单,就是求Ñ个数字的和。麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(<= 100)。随后一行按格式“a1 / b1 a2 / b2 ...”给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和最简形式 - 即将结果写成“整数部分分数部分”,其中分数部分写成“分子/分母”,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:
 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

思路:先将输入的分数的分子和分母分别用两个数组存储,然后通过求最大公约数和最小公倍数的方法进行约分和通分,求解最后的答案。

注意:1数据要采用长型存储,否组溢出。

          2.因为数据中有分数,所以求解最大公约数和最小公倍数都必须传入正整数

          3.答案输出的时候有很多坑点,比如输出的整数部分为负数,输出的分数部分为0/1。最后两个测试点的都是输出问题。

import java.util.Scanner; 

公开课L1_009 { 
	public static long maxGY(long a,long b){//计算最大公约数
		而(a%b!= 0){ 
			长时间
			温度= A; 
			A = B; 
			B = TEMP%B; 
		} 
		返回B; 
	} 
	public static long minGB(long a,long b){//计算最小公倍数
		返回a * b /(maxGY(a,b)); 
	} 
	公共静态无效的主要(字串[] args){ 
		// TODO生成自动的方法存根
		扫描仪扫描仪=新扫描仪(System.in); 
		int n = scanner.nextInt(); 
		long [] son = new long [n]; 
		long [] mother = new long [n]; 
		for(int i = 0; 我<n; i ++){//存储分子和分母
			String temp = scanner.next (); 
			long a = Integer.parseInt(temp.split(“/”)[0]);
			儿子[I] = A; 
			母亲[I] =的Integer.parseInt(temp.split(“/”)[1]); 
		} 
		长s =儿子[0],m =母亲[0]; 
		for(int i = 1; 我<n; i ++){//计算结果
			long mingb = minGB(m,mother [i]); 
			S = mingb /米* S + mingb /母亲[I] *儿子[I]; 
			米=明戈; 
		} 
		long maxgy = maxGY(Math.abs(s),m); //传入分子的绝对值,避免最大公约数计算错误
		S = S / maxgy; 
		M = M / maxgy; 
		如果(Math.abs(s)> = m){//当s的绝对值大于m时,一定会输出整数部分
			if(s%m == 0){//当s被整除时,只输出整数部分
				的System.out.println(S / M); 
			} else {// s不能被整除,输出整数和分数部分
				长时间= s / m; 
				S = S%米;  System.out.println(temp +“”+ s +“/”+ m);  }  } else {// s的绝对值小于m,只输出分数部分 如果(S!= 0) 的System.out.println(S +“/”+ M);  其他 的System.out.println(一个或多个); //小号== 0,直接输出小号 }  }  }

如果有什么问题,欢迎交流~~~~~



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值