题目来源:
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第1行给出正整数N(<=100);第2行中按照“a1/b1 a2/b2 ……”的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照“a/b”的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:4 1/2 1/6 3/6 -5/10输出样例1:
1/6输入样例2:
2 4/3 2/3输出样例2:
1
解1:
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //正整数n int n = scanner.nextInt(); //分子,分母 int fenzi=0; int fenmu=1; for(int i=0;i<n;i++) { //输入一个分数,a,b来接受分子和分母 String[] str = scanner.next().split("/"); int a = Integer.parseInt(str[0]); int b = Integer.parseInt(str[1]); //两个分数相加 fenzi = fenzi*b+a*fenmu; fenmu = fenmu*b; } //将分母*n之后,再进行一次简化 fenmu = fenmu*n; //将分子和分母最简化的t int t = gcd(fenzi,fenmu); if(t!=0) { fenzi = fenzi/t; fenmu = fenmu/t; } if(fenzi==0 ) { System.out.println(fenzi); } else if(fenmu==1) System.out.println(fenzi); else { System.out.println(fenzi+"/"+fenmu); } } /* * 这是贪心算法。 设最大公约数为X,则存在整数i,j使得: a = i*X,b = j*X 又因为c = a % b 所以存在整数k使得: c = a-k*b = i*X - k*j*X = (i-j*k)*X 即X也是c的公约数,然后a = b; b = c; 如此循环,总有b = k*a的时侯,这时b就是最大公约数。 * */ public static int gcd(int fenzi,int fenmu) { int r; if (fenmu == 0 && fenzi == 0) return 0; if (fenmu == 0) return fenzi; if (fenzi == 0) return fenmu; while (true) { r = fenmu % fenzi; if (r == 0) break; fenmu = fenzi; fenzi = r; } return fenzi; } }
解法2:
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //正整数n int n = scanner.nextInt(); //分子,分母 int fenzi=0; int fenmu=1; for(int i=0;i<n;i++) { //输入一个分数,a,b来接受分子和分母 String[] str = scanner.next().split("/"); int a = Integer.parseInt(str[0]); int b = Integer.parseInt(str[1]); //两个分数相加 fenzi = fenzi*b+a*fenmu; fenmu = fenmu*b; } //将分母*n之后,再进行一次简化 fenmu = fenmu*n; //将分子和分母最简化的t int t = simple(fenzi,fenmu); if(t!=0) { fenzi = fenzi/t; fenmu = fenmu/t; } if(fenzi==0) { System.out.println(fenzi); return ; } //标记是否是负数 boolean flag =false; if(fenzi*fenmu<0) //测试 1/-2 -1/2 { flag = true; System.out.print("-"); } //输出负号 if(fenmu==1) System.out.println(Math.abs(fenzi)); else { System.out.println(Math.abs(fenzi)+"/"+Math.abs(fenmu)); } } public static int simple(int fenzi,int fenmu) { int min = Math.min(Math.abs(fenzi), Math.abs(fenmu)); for(int i=min;i>1;--i) { if(fenzi%i==0 && fenmu%i==0) { return i; } } return 0; } }
原文地址:http://blog.csdn.net/ch717828/article/details/44522853