题目来源:
本题要求编写程序,计算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