1. 程式人生 > >大數類題目——————JAVA實現

大數類題目——————JAVA實現

HDU 1002 A + B Problem II

直接寫就好了,不過格式有些麻煩

import java.math.*;
import java.util.*;
public class HDU1002{
	public static void main(String[] args){
		Scanner cin = new Scanner(System.in);
		int t = cin.nextInt();
		int num = 1;
		int x=0;
		while(t>0){
			if(x!=0)	System.out.println("");
			else x=
1; BigInteger a = cin.nextBigInteger(); BigInteger b = cin.nextBigInteger(); System.out.println("Case "+num+":"); System.out.println(a+" + "+b+" = "+a.add(b)); // System.out.println("Case "+num+":\n"+a+" + "+b+" = " +a.add(b)); //寫著一句話Wa了好多次,我現在有些懷疑println和"\n"不一樣。 num++; t--; }
} }


POJ 2506 Tiling

推出公式:
d p [ n ] = d

p [ n 1 ] + 2 d p [ n 2 ] \Large dp[n]=dp[n-1]+2*dp[n-2]

不過JAVA寫大數還真是方便 因為懶


import java.util.*;
import java.math.*;//得有這個庫
public class Main{
	public static void main(String[] agrs){
		Scanner cin = new Scanner(System.in);
		BigInteger[] a = new BigInteger[300];//定義大數陣列
		a[0] = BigInteger.ONE;//初始化
		a[1] = BigInteger.ONE;//初始化
		a[2] = a[1].add(a[0].add(a[0])); 
		for(int i=3;i<=299;i++)
			a[i] = a[i-1].add(a[i-2].add(a[i-2]));
		while(cin.hasNext()){
			int n = cin.nextInt();
			System.out.println(a[n]);
		}
	}		
}	


HDU 1042 N!

求最大是 10000! 肯定得用大數來解決

import java.math.*;
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        BigInteger n;
        while(cin.hasNext()){
            int x = cin.nextInt();
            n = BigInteger.ONE;//初始化為1
            for(int i=1;i<=x;i++)
                n = n.multiply(BigInteger.valueOf(i));
            System.out.println(n);
        }
    }
}


HDU 1047 Integer Inquiry

多個大數相加,不過哦需要注意一下輸入輸出格式,
n組資料,每兩個輸出之間有一個空行

import java.math.*;
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        while(n-->0){
            BigInteger ans = BigInteger.ZERO;
            BigInteger x;
            while(cin.hasNextBigInteger()){
                x = BigInteger.ZERO;
                x = cin.nextBigInteger();
                if(!x.equals(BigInteger.valueOf(0)))
                    ans = ans.add(x);
                else{
                    System.out.println(ans);
                    if(n!=0)
                        System.out.println("");
                    break;
                }
            }
        }
        System.gc();
    }
}



HDU 1715 大菲波數

import java.math.*;
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        BigInteger[] a;
        a = new BigInteger[2000];
        a[0] = BigInteger.ZERO;
        a[1] = BigInteger.ONE;
        for(int i=2;i<1005;i++)
            a[i] = a[i-1].add(a[i-2]);
        int  n = cin.nextInt();
        while(n-->0){
            int i = cin.nextInt();
            System.out.println(a[i]);
        }
    }
}


HDU 1063 Exponentiation

浮點數的冪,需要注意輸出格式
0.123 輸出為 .123

import java.math.*;
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()){
            BigDecimal a = cin.nextBigDecimal();//輸入大浮點數
            int n = cin.nextInt();
            String res = a.pow(n).stripTrailingZeros().toPlainString();//去掉整數後的小數點和多餘的0
            if(res.startsWith("0"))
                res = res.substring(1);    //去掉前導0                    
            System.out.println(res);
        }
    }
}


HDU 1753 大明A+B

大浮點數相加

import java.util.*;
import java.math.*;
public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        BigDecimal a,b;
        while(cin.hasNext()){
            a = cin.nextBigDecimal();
            b = cin.nextBigDecimal();
            String res = a.add(b).stripTrailingZeros().toPlainString();
            System.out.println(res);
        }
    }
}


HDU 1316 How Many Fibs?

求區間【a,b】中有多少個斐波那契數

import java.util.*;
import java.math.*;
public class Main{
    public static void main(String[] args){
        Scanner cin = new Scanner(System.in);
        BigInteger[] a  = new BigInteger[3000];
        a[0] = new BigInteger("1");
        a[1] = new BigInteger("1");
        for(int i=2;i<=500;i++)
            a[i] = a[i-1].add(a[i-2]);
        BigInteger x, y;

        while(cin.hasNext()){
            x = cin.nextBigInteger();
            y = cin.nextBigInteger();
            if(x.compareTo(BigInteger.ZERO)==0 && y.compareTo(BigInteger.ZERO)==0)    break;
            int ans = 0;
            for(int i=1;i<=500;i++){
                if(x.compareTo(a[i]) <= 0 && y.compareTo(a[i]) >= 0)    ans++;
                if(y.compareTo(a[i]) < 0)    break;
            }    
            System.out.println(ans);
        }
    }
}