POJ3197(连分数表示)

题目:http://poj.org/problem?id=3197

 

分析:对于分数利用欧几里德算法可以写成连分数的形式,这样p和q很大,用Java大数写很方便。

 

import java.io.*;
import java.util.*;
import java.math.BigInteger;

public class Main
{
	 static final int N = 100005;
	 static BigInteger ans[] = new BigInteger[N];
	 static int cnt = 0;
	 
	 static boolean EqualToZero(BigInteger x)
	 {
		  if(x.compareTo(BigInteger.ZERO) == 0) return true;
		  else return false;
	 }
	 
	 static void gcd(BigInteger a,BigInteger b)
	 {
		  cnt = 0;
		  ans[cnt++] = a.divide(b);
		  BigInteger r = a.mod(b);
		  while(!EqualToZero(r))
		  {
			   a = b;
			   b = r;
			   ans[cnt++] = a.divide(b);
			   r = a.mod(b);
		  }
		  ans[cnt++] = BigInteger.ONE;
		  ans[cnt-2] = ans[cnt-2].subtract(BigInteger.ONE);
	 }
	 
	 public static void main(String[] args)
	 {
		  Scanner cin = new Scanner(System.in);
		  int tt = 1;
		  while(cin.hasNextBigInteger())
		  {
			   BigInteger p = cin.nextBigInteger();
			   BigInteger q = cin.nextBigInteger();
			   if(EqualToZero(p) && EqualToZero(q)) break;
			   gcd(p,q);
			   System.out.println("Case "+(tt++)+":");
			   System.out.println(p+" / "+q);
			   int length = 3*(cnt-1);
			   for(int i=0;i<cnt;i++)
				   length += ans[i].toString().length();
			   int len = length;
			   int ct = 0;
			   for(int k=0;k<cnt-1;k++)
			   {
			       int pos = ans[k].toString().length() +  3;
			       int record = pos;
			       int num = length - pos;
			       int tmp = 0;
			       if(num % 2 == 1)
			       {
				        tmp = num / 2 + 1;
				        pos += tmp;
			       }
			       else
			       {
				        tmp = num / 2;
				        pos += tmp;
			       }
			       for(int i=1;i<=ct;i++)
			    	    System.out.print(".");
			       for(int i=1;i<=length;i++)
			       {
				        if(i == pos) System.out.print("1");
				        else System.out.print(".");
			       }
			       System.out.println("");
			       for(int i=1;i<=ct;i++)
			    	    System.out.print(".");
			       System.out.print(ans[k]+".+.");
			       for(int i=1;i<=num;i++)
			    	   System.out.print("-");
			       System.out.println("");
			       length -= record;
			       ct += record;
			   }
			   for(int i=1;i<len;i++)
				   System.out.print(".");
			   System.out.println("1");
		  }
	 }
}


 

你可能感兴趣的:(POJ3197(连分数表示))