poj 3101 Astronomy (java 分数的最小公倍数 gcd)

题目链接

要用大数,看了别人的博客,用java写的。

题意:求n个运动周期不完全相同的天体在一条直线上的周期。

分析:两个星球周期为a,b。则相差半周的长度为a*b/(2*abs(a-b)),对于n个只需求这n个

分数的最小公倍数即可。

分数的最小公倍数 = 分子的最小公倍数/分母的最大公约数

 1 import java.util.*;
 2 import java.math.*;
 3 public class Main {
 4     public static int [] t = new int [1200];
 5     public static int [] tt = new int [1200];
 6     public static BigInteger [] fz = new BigInteger [1200];
 7     public static BigInteger [] fm = new BigInteger [1200];
 8
 9     public static int gcd(int a, int b){
10         return b==0?a:gcd(b, a%b);
11     }
12     public static void main(String args[]){
13     int n, m;
14      Scanner cin=new Scanner(System.in);
15      n = cin.nextInt();
16      for(int i = 0; i < n; i++)
17          t[i] = cin.nextInt();
18      Arrays.sort(t, 0, n);   //对数组排序
19      m = 0;
20      tt[m++] = t[0];
21      for(int i = 1; i < n; i++)
22          if(t[i]!=t[i-1])
23              tt[m++] = t[i];
24      for(int i = 1; i < m; i++){
25          int a = tt[i]*t[0];
26          int b = 2*(tt[i]-tt[0]);
27          int g = gcd(a, b);
28          fz[i] = BigInteger.valueOf(a/g);
29          fm[i] = BigInteger.valueOf(b/g);
30      }
31      BigInteger t1, t2;
32      t1 = fz[1]; t2 = fm[1];
33      for(int i = 2; i < m; i++)
34      {
35          BigInteger aa = t1.multiply(fz[i]);
36          BigInteger gg = t1.gcd(fz[i]);
37          t1 = aa.divide(gg);
38          t2 = t2.gcd(fm[i]);
39      }
40      System.out.println(t1+" "+t2);
41     }
42 }

poj 3101 Astronomy (java 分数的最小公倍数 gcd)

时间: 2024-11-06 10:50:46

poj 3101 Astronomy (java 分数的最小公倍数 gcd)的相关文章

poj 3101 Astronomy(分数的最小公倍数)

http://poj.org/problem? id=3101 大致题意:求n个运动周期不全然同样的天体在一条直线上的周期. 这题我是看解题报告写的,没想到选用參照物,用到了物理中的角速度什么的. 由于n个天体的周期已知,那么它们的角速度为vi = 2*pi/Ti,若统一选第0个天体为參照物,那么其余天体的相对速度vi' =  2*pi*(T0-Ti)/(T0*Ti)(把周期T同样的天体合为一个天体).则与第0个天体角度相差180度的时间为ti = (T0*Ti)/((T0-Ti)*2). 那么

POJ 3101 Astronomy (大数+LCM)

Astronomy Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5167   Accepted: 1127 Description There are n planets in the planetary system of star X. They orbit star X in circular orbits located in the same plane. Their tangent velocities a

poj 3101 Astronomy

http://poj.org/problem?id=3101 这道题就是求所有分子的最小共倍数和分母的最大公约数. 1 import java.math.BigInteger; 2 import java.util.*; 3 import java.util.Arrays; 4 public class Main { 5 public static void main(String []args) 6 { 7 Scanner cin=new Scanner(System.in); 8 int n

POJ 3101 大数+gcd

题目大意: 星星作圆周运动的周期给出,若已连成一条线,下一次所有星星在同一条线上的时间 用分数形式输出 这里我们可以利用追及问题来计算出两个星星之间连成一条直线的时间,也即速度快的星星追上速度慢的星星弧度PI t = PI /abs (2PI / t1 - 2PI / t2) = t1 * t2 / (2 * abs(t1 - t2)) 这样前面作为分子后面作为分母,每次得到一个分数记得利用gcd化简 然后把所有两两得到的时间差求个最小公倍数 分数的最大公倍数是分子求最小公倍数, 分母求最大公约

poj3101--Astronomy(分数的最小公倍数)

题目链接:点击打开链接 题目大意:有n个行星,给出每个行星的旋转的周期.问最少多少时间后n个行星会在一条直线上,初始点在一起,不存在全部的行星都有同一个周期 如果A行星的周期是t1.B行星的周期是t2(t2>t1),要在一条直线上,一定会执行的相差半个周期的倍数,时间(t/t2 - t/t1) % (1/2) = 0.也就是t*(t1-t2)/(t1*t2)%(1/2) = 0,要是时间最小.所以也就是差出一个半周期.也就是t = (t2-t1)/(t2*t1*2)这个t也就是A.B执行到一条直

POJ Octal Fractions(JAVA水过)

题目链接:CLICK HERE~ 虽然java一下模拟水过,但是我看到别人的一段神奇代码,贴出和大家共享. import java.math.*; import java.util.*; class Main{ public static void main(String args[]){ Scanner cin = new Scanner(System.in); BigDecimal Eight = new BigDecimal(8); while(cin.hasNext()){ String

POJ 3982 序列(JAVA,简单,大数)

题目 //在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息, //可以先建立对象,然后通过对象调用方法: import java.io.*; import java.util.*; import java.math.*; public class Main { /** * @xqq */ public BigInteger a99(BigInteger a, BigInteger b, BigInteger c) { f

poj 2506 Tiling(java解法)

题目链接:http://poj.org/problem?id=2506 本题用的java解的,因为涉及到大数问题,如果对java中的大数操作不熟悉请点这儿:链接 思路:地推公式f[i]=f[i-1]+2*f[i-2] code: import java.math.*; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(Syst

ACM学习历程—HDU1717 小数化分数2(gcd)

Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数. Input 第一行是一个整数N,表示有多少组数据. 每组数据只有一个纯小数,也就是整数部分为0.小数的位数不超过9位,循环部分用()括起来. Output 对每一个对应的小数化成最简分数后输出,占一行. Sample Input 3 0.(4) 0.5