1. 程式人生 > >JAVA大數高精度

JAVA大數高精度

板子一

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    static BigDecimal gold = new BigDecimal("1.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475408807538689175212663386222353693179318006076672635443338908659593958290563832266131992829026788");

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//定義輸入
        while(sc.hasNext()) {
            BigDecimal a = new BigDecimal(sc.next());//輸入
            BigDecimal b = new BigDecimal(sc.next());
            if(a.compareTo(b)==1) {//compareTo比較函式,如果a>b返回1,      a<b返回-1,a==b返回0;
                BigDecimal c=a;
                a=b;
                b=c;
            }
            BigDecimal temp = b.subtract(a).multiply(gold).subtract(a);
            //if(a!=floor(k*gold)

            if(temp.compareTo(BigDecimal.ONE)==-1 && temp.compareTo(BigDecimal.ZERO)==1)
                System.out.println(0);
            else
                System.out.println(1);
        }
    }

}

1. b1.add(b2).doubleValue();//表示b1+b2的結果轉換成double

add//加法  subtract//減法  multiply//乘法  divide //除法

2.for(int i=1;i<=n;i++) { ans=ans.multiply(BigInteger.valueOf(i)); }

//Ans為大數,所以要把i轉換為大數型別

3.String s=ans.toPlainString();

         if(s.charAt(0)=='0') {//charAt(n)返回字串中下標為n的字元

         s=s.substring(1);

         }

//d為int型,a,b,c都為大數
c=a.add(b);             //  相加
c=a.subtract(b);       //    相減
c=a.multiply(b);          // 相乘
c=a.divide(b);        // 相除取整
c=a.gcd(b);          //  最大公約數
c=a.remainder(b);   //  取餘
c=a.mod(b);         // a mod b
c=a.abs();           // a的絕對值
c=a.negate();        // a的相反數
c=a.pow(d);           // a的b次冪        d為int型    
c=a.max(b);           //  取a,b中較大的
c=a.min(b);                //  取a,b中較小的
d=a.compareTo(b);    //比較a與b的大小 d=-1小於d=0等於 d=1大於  d為int型
a.equals(b);       //  判斷a與b是否相等    相等返回true  不相等返回false  
d=a.intValue();      //       將大數a轉換為 int 型別賦值給 d  
e=a.longValue();     //       將大數a轉換為  long 型別賦值給 e  
f=a.floatValue();    //       將大數a轉換為  float 型別賦值給 f  
g=a.doubleValue();   //       將大數a轉換為  double 型別賦值給 g  
s=a.toString();      //     將大數a轉換為 String 型別賦值給 s  
<span style="color:#ff0000;">s=a.toPlainString();  //將大數a轉換為String型別賦值給s,且不表示為科學計數法</span>  
a=BigInteger.valueOf(e);  // 將 e 以大數形式賦值給大數 a   e只能為long或int  
a=newBigInteger(s, d);  // 將s數字字串以d進位制賦值給大數a如果d=s字元數字的進位制則等同於將數字字串以大數形式賦值給大數a  
String st = Integer.toString(num, base); //把int型num當10進位制的數轉成base進位制數存入st中    (base <= 35).  
int num = Integer.parseInt(st, base); //把st當做base進位制,轉成10進位制的int  
(parseInt有兩個引數,第一個為要轉的字串,第二個為說明是什麼進位制).    
BigInter m = new BigInteger(st, base); // st是字串,base是st的進位制.  
BigInteger a;  
int b;  
Stringc;  
a=cin.nextBigInteger(b);   //以b進位制讀入一個大數賦值給a  
c=a.toString(b);          // 將大數a以b進位制的方式賦給字串c  
a=newBigInteger(c, b);  //把c 當做“b進位制“轉為十進位制大數賦值給a  

大數高精度求sqrt(n)

BigDecimal one = new BigDecimal(1);  
         BigDecimal two = new BigDecimal(2);  
         BigDecimal three = new BigDecimal(3);  
         BigDecimal five = new BigDecimal(5);  
         BigDecimal l=new BigDecimal(2),r=new BigDecimal(3);  
         for(int i=0; i<1000; ++i)  
         {  
             BigDecimal mid=r.add(l).divide(two);  //因為sqrt(5)是在2到3之間
             if(mid.multiply(mid).compareTo(five)<0)  
             {  
                 l=mid;  
             }  
             else r=mid;  
         }  

一個是 BigDecimal.stripTrailingZeros(),作用是將BigDecimal轉化為最簡形式(去掉末尾多餘的0或小數點)

還有 BigDecimal.toPlainString() ,作用是將BigDecimal轉為字串,因為小數位數過多的話會被輸出成科學計數法表示,不希望那樣的話就要用到這個方法;

import java.io.*;
import java.util.*;
import java.math.*;
import java.lang.*;
public class Main
{
	public static void main(String[] args)
	{
		Scanner cin = new Scanner(new BufferedInputStream(System.in)); 
		BigDecimal a,b,c;
		while(cin.hasNext())
		{
			a=cin.nextBigDecimal();
			b=cin.nextBigDecimal();
			
			c=a.add(b);
			c=c.stripTrailingZeros();
			String s=c.toPlainString();
			System.out.println(s);
		//	以上四行也可直接寫成 
		//	System.out.println(a.add(b).stripTrailingZeros().toPlainString());
		}}}