12:分数求和
分数运算法则
*1、同分母分数相加,分母不变,即分数单位不变,分子相加,能约分的要约分。
例1:
例2:
2.异分母分数相加,先通分,即运用分数的基本性质将异分母分数转化为同分母分数,改变其分数单位而大小不变,再按同分母分数相加去计算,最后能约分的要约分。
例1:
例2:
*
正题开始
描述
输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为1,则直接用整数表示。
如:5/6、10/3均是最简形式,而3/6需要化简为1/2, 3/1需要化简为3。
分子和分母均不为0,也不为负数。
输入
第一行是一个整数n,表示分数个数,1 <= n <= 10;
接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。
输出
输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。
样例输入
2
1/2
1/3
样例输出
5/6
java题解:
import java.util.Scanner;
public class oj12分数求和 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
int[] fenzi = new int[n+1];//分子
int[] fenmu = new int[n+1];//分母
for (int i = 0; i < n; i++) {
String[] s = sc.nextLine().split("/");
fenzi[i] = Integer.parseInt(s[0]);//分子
fenmu[i] = Integer.parseInt(s[1]);//分母
}
int ans = 0;
int bak = 0;//分子和
int cnt = 1;//分母和
//求分母之间的最小公倍数
int min = lcm(fenmu[0],fenmu[1]);
for (int i = 2; i < n; i++) {
min = lcm(min,fenmu[i]);
}
for (int i = 0; i < n; i++) {//分子和 = (分母之间的最大公倍数 / 分母)* 分子,再将所有分子相加
bak = bak + fenzi[i] * (min / fenmu[i]);
}
for (int i = 0; i < n; i++) {//分母 = 它们的最小公倍数
cnt = min;
}
int m = gcd(cnt,bak);
if(cnt/m==1)System.out.println(bak/m);
else System.out.println(bak/m+"/"+cnt/m);//分子分母同时除去最大公约数即得最简式
}
//求最大公约数
public static int gcd(int x,int y) {
if(x%y==0) return y;
else return gcd(y,x%y);
}
//求最小公倍数
public static int lcm(int x,int y) {
return (x*y)/gcd(x,y);
}
}
有没有大佬知道,我这题在oj平台怎么提交都说错的,我输入样例包括自己用的一些样例都是没错啊。
你比如:
输入:
3
1/3
1/4
1/5
输出
47/60
你再比如
输入:
3
3/1
4/1
5/1
输出
12
你还比如
输入:
3
6/2
4/2
8/1
输出
13
你还比如
输入:
2
3/6
3/9
输出
5/6
死磕了一下午,算了,待有缘人来帮我解答,感谢qwq