结构-05. 有理数均值(20)

来源:互联网 发布:数据架构师发展 编辑:程序博客网 时间:2024/05/14 04:12

题目来源:

结构-05. 有理数均值(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
乔林(清华大学)

本题要求编写程序,计算N个有理数的平均值。

输入格式:

输入第1行给出正整数N(<=100);第2行中按照“a1/b1 a2/b2 ……”的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式:

在一行中按照“a/b”的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:
41/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
24/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; } }          


  



  

  

  

  



0 0