JAVA大數高精度
阿新 • • 發佈:2019-01-03
板子一
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());
}}}