Java大數處理

之前整理過有關Java的基本知識,也寫了幾個有關java的題目,不過發現不夠完善,如今從新整合一下。java

1.Java的輸入與輸出

java的輸入是先定義一個scanner,而後用這個進行輸入,而且每一種輸入都有相應的輸入函數,具體以下:ide

public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner ( System.in);
        int a;
        double b;
        BigInteger c;
        String st;
        a = cin.nextInt();
        b = cin.nextDouble();
        c = cin.nextBigInteger();
        d = cin.nextLine();
        // 每種類型都有相應的輸入函數.
    }
}

Java的輸出相較於輸入來講就簡單一些了。函數

System.out.println(a + " " + b);
System.out.printf("%d %10.5f\n", a, b);

/*規格化的輸出:
函數:這裏0指一位數字,#指除0之外的數字(若是是0,則不顯示),四捨五入.*/
DecimalFormat fd = new DecimalFormat("#.00#");
DecimalFormat gd = new DecimalFormat("0.000");
System.out.println("x =" + fd.format(x));
System.out.println("x =" + gd.format(x));

 

2.大數部分

java支持大數的操做,其中也是由具體函數實現的。看下面的例子:ui

int a = 123, b = 456;
BigInteger x, y, z, ans;
x = BigInteger.valueOf(a);//轉換
y = BigInteger.valueOf(b);
ans = x.add(y);
ans = x.divide(y);
ans = x.mod(y);
if (ans.compareTo(x) == 0)//比較
    System.out.println("相等");

這裏就寫出了int型轉換成大數型以及加減乘除比較的基本操做。其中函數原型以下:spa

BigInteger add(BigInteger other) 
BigInteger subtract(BigInteger other) 
BigInteger multiply(BigInteger other) 
BigInteger divide(BigInteger other) 
BigInteger mod(BigInteger other) 
int compareTo(BigInteger other) 
static BigInteger valueOf(long x) 

這是大整數的操做,其中還有一個數據類型爲:BigDecimal,表示小數,操做與以上相同。code

3.格式化輸出:

之前作題遇到過這樣的狀況,如何去掉末尾的0,有一個具體的函數,stripTrailingZeros()函數就是用於去除末尾多餘的0的,可是此時程序的輸出爲科學記數法例如: 1E+2。解決的方法很簡單,若是想要避免輸出科學計數法的字符串,咱們要用toPlainString()函數代替toString()。如:System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());此時程序的輸出就爲 100。具體實現:orm

        Scanner in=new Scanner (System.in);
        BigDecimal a,b;
        while(in.hasNext())
        {
            a=in.nextBigDecimal();
            b=in.nextBigDecimal();
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());
        }

4.具體實例:

HDU - 1042:計算階乘:blog

import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
    public static void main(String[] args) 
    {
        Scanner in=new Scanner (System.in);
        int n;

        while(in.hasNext())
        {
            n=in.nextInt();
            BigInteger sum=BigInteger.valueOf(1);
            for(int i=1;i<=n;i++)
                sum=sum.multiply(BigInteger.valueOf(i));
            System.out.println(sum);
        }
    }
}

POJ1001 計算a^b 注意是小數ip

import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
    public static void main(String[] args) 
    {
        Scanner in=new Scanner (System.in);
        int n;
        BigDecimal a,b;
        while(in.hasNext())
        {
            b=BigDecimal.valueOf(1);
            a=in.nextBigDecimal();
            n=in.nextInt();
            for(int i=0;i<n;i++)
            {
                b=b.multiply(a);
            }
            String s = b.stripTrailingZeros().toPlainString();
            if(s.startsWith("0"))
                s=s.substring(1);
            System.out.println(s); 
        }
    }
}

HDU - 1753  計算A+B 保留最簡形式ci

import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class Main//注意在oj提交是要用Main
{
    public static void main(String[] args) 
    {
        Scanner in=new Scanner (System.in);
        BigDecimal a,b;
        while(in.hasNext())
        {
            a=in.nextBigDecimal();
            b=in.nextBigDecimal();
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());
        }
    }
}

UVA 10007:計算卡特蘭數

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        BigInteger []k = new BigInteger[1100];
        k[0] = BigInteger.valueOf(1);
        for(int j=1;j<310;j++)
        {
                k[j]=k[j-1].multiply(BigInteger.valueOf(4*j-2)).divide(BigInteger.valueOf(j+1));  
        }
        while (true)  
        {  
            int times=input.nextInt(); 
            BigInteger sum=BigInteger.valueOf(1);
            if(times!=0)  
                {
                    for(int i=1;i<=times;i++)
                        sum=sum.multiply(BigInteger.valueOf(i));
                    System.out.println(sum.multiply(k[times]));  
                }
            else 
            {  
                break;  
            }  
        }  
    }

}
相關文章
相關標籤/搜索