题目来源:
结构-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;
}
}