Java同学实在是太少啦,写个题解吧。
这道题其实绕挺多弯的,前面很多同学的题解把大部分问题都讲清楚了,这里说一个需要注意的,我们在更相减损术的
退出判断那块,原版的更相减损术是当较小者为0时退出,这里为什么是1呢?
因为我们传入的是是P^k1和P^k2次幂,我们求的是k1和k2的最大公约数、也就是说k1和k2中的较小者变为0的时候退出,
注意别忘了,我们传入的实际上是次幂,所以k1和k2中的较小者变为0的时候对应P^k1和P^k2次幂的值为1
所以判断的时候是当P^k1和P^k2次幂为1时退出。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
long[] a = new long[n];
for(int i = 0 ; i < n ; i++){
a[i] = input.nextLong();
}
Arrays.sort(a);
int cnt = 0;//等比项的个数
long[] p = new long[n];//分子
long[] q = new long[n];//分母
for(int i = 1 ; i < n ; i++){
if(a[i] != a[i-1]){
long gcd = gcd(a[i],a[0]);//每一项都是a[i] / a[0],用最大公约数进行约分
p[cnt] = a[i] / gcd;
q[cnt++] = a[0] / gcd;
}
}
// System.out.println(Arrays.toString(p));
// System.out.println(Arrays.toString(q));
long FZ = p[0];//第一个的p^k
long FM = q[0];//第一个的q^k
for(int i = 1 ; i < cnt ; i++){
FZ = gcd_sub(FZ,p[i]);
FM = gcd_sub(FM,q[i]);
}
System.out.println(FZ+"/"+FM);
}
public static long gcd(long a,long b){
return b == 0 ? a : gcd(b,a%b);
}
public static long gcd_sub(long y, long x){
if(y < x){
long tmp = y;
y = x;
x = tmp;
}
if(x == 1)return y;
return gcd_sub(x,y/x);//
}
}