POJ - 3101 - Astronomy - (JAVA大数,分数的最小公倍数)

AC链接:http://poj.org/problem?id=3101

原博客:http://blog.csdn.net/huayunhualuo/article/details/51055611

感觉应该记录一下的题目。

题意:已知n个行星和每一个行星的周期Ti,求所有行星共线的最短的周期。

vi=2πTi,0点(所有行星均以其为参考点)0vi=2πTiT0TiTo,则i行星相对0行星Ti=πvi=TiT02(TiT0)T1,T2,T3,Tn1LCM(a,b)=a×bGCD(a,b),LCM(ab,cd)=LCM(a,c)GCD(b,d)mnab,cdmn×ba=N,mn×dc=Nma,cnb,dmnm=LCM(a,c),n=GCD(b,d)Java


代码:

import java.math.*;
import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int i,n,num;
		int[] tmp=new int[1005];
		int[] t=new int[1005];
		n=cin.nextInt();
		for(i=0;i<n;i++)
			tmp[i]=cin.nextInt();
		//去重
		Arrays.sort(tmp,0,n);
		num=0;t[0]=tmp[0];
		for(i=1;i<n;i++)  //t下标从0到num
		{
			if(tmp[i]!=tmp[i-1])
				t[++num]=tmp[i];
		}
		
		BigInteger a,b,gc,up=null,down=null; //up是分子,down分母,gc是分子分母的最大公约数用来约分
		
		for(i=1;i<=num;i++)
		{
			a=BigInteger.valueOf(t[i]*t[0]);
			b=BigInteger.valueOf((t[i]-t[0])*2);
			gc=a.gcd(b);
			if(i==1) //如果处理到第二颗行星,此时得到第一个分式,直接约分
			{
				up=a.divide(gc);
				down=b.divide(gc);
			}else{ //如果此时是在求分式的LCM,那么此时的up,down,a,b分别一一对应公式LCM(a/b,c/d)中的a,b,c,d
				a=a.divide(gc);
				b=b.divide(gc);
				up=up.multiply(a).divide(up.gcd(a)); //up=(up*a)/(gcd(up,a))
				down=down.gcd(b);                    //down=gcd(down,b);
			}
		}
		System.out.println(up+" "+down);
		cin.close();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值