码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-22 09:16:32      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:java   acm   pat   

题目来源:

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

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

本题要求编写程序,计算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;
 }
 


}
  


  
  
  
  


  



  

  

  

  



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

标签:java   acm   pat   

原文地址:http://blog.csdn.net/ch717828/article/details/44522853

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!