1. 程式人生 > >JAVA高精度_求高精度冪

JAVA高精度_求高精度冪

要想用Java輕快的水過這道題,要先了解下JAVA.math中的幾個方法

1.Java.math.BigDecimal.toPlainString() 返回此BigDecimal的字串表示形式不帶指數字段。

例如來個小對比:函式 toPlainString() 和 toString()

對於  BigDecimal b ;     (b=(0.4321)^ 20)
String s = b.toPlainString() ;
System.out.println(s) ;
輸出為:
0.00000005148554641076956121994511276767154838481760200726351203835429763013462401

若String s = b.toString() ;
輸出為:
5.148554641076956121994511276767154838481760200726351203835429763013462401E-8

給一個字串1.238761976E-10
如何得到0.0000000001238761976這個字串呢?

BigDecimal bd = new BigDecimal("1.238761976E-10");  
System.out.println(bd.toPlainString());

2.java.math.BigDecimal.stripTrailingZeros() 返回一個BigDecimal,它在數值上等於這一個,但表示形式移除所有尾部零。

用一個例子來說明:

有一個特殊情況,就是整數為0的時候:

BigDecimal num=new BigDecimal("0.00").stripTrailingZeros();
System.out.println(num);
輸出為0.00 

這裡面有個元件精度的轉換,具體也沒搞清楚,後面學Java課程的時候回來繼續補充

3.startsWith()方法:

  1. if(a.startsWith(b))   
  2. //判斷字串a 是不是以字串b開頭.
 
  1. if(a.endsWith(b))   
  2. //判斷字串a 是不是以字串b結尾.
startsWith方法測試此字串從指定索引開始的子字串是否以指定字首開始

語法1 public boolean startsWith(String prefix) 

返回值:如果引數表示的字元序列是此字串表示的字元序列的字首,則返回true;否則返回false。如果引數是空字串,或者等於此String物件(用equals(Object)方法確定),則返回true。

引數:prefix為指定的字首。

示例  本示例使用startsWith方法來判斷字串str是否以字串“like”開始,並將結果賦值給boolean變數b。由於字串str不是以字串“like”開始的,因此boolean型別變數b的值為false。

String str = "I like Java";    //定義一個字串

boolean b = str.startsWith("like");

System.out.println(b)

語法2 public boolean startsWith(String prefix , int toffset) 

返回值:如果引數表示的字元序列是此物件從索引toffset處開始的子字串,則返回true;否則返回false。如果toffset為負或大於此String物件的長度,則結果為false;否則結果與該表示式的結果相同。

引數:prefix為指定的字首。

引數:toffset為在字串中開始查詢的位置。

示例  本示例使用startsWith方法來判斷字首“I l”是否是字串strCom1中開始索引位置是0的字元序列,並將結果賦值給boolean變數strB。由於字串strCom1中開始索引位置在0的字元序列與指定的字首“I l”相同,因此物件strB為true。

String strCom1 = "I like Java";   //定義一個字串

boolean strB = strCom1.startsWith("I l",0);

System.out.println(strB);

4.String中的subString()方法:

str=str.substring(int beginIndex);擷取掉str從首字母起長度為beginIndex的字串,將剩餘字串賦值給str;

str=str.substring(int beginIndex,int endIndex);擷取str中從beginIndex開始至endIndex結束時的字串,並將其賦值給str;


public String substring(int beginIndex, int endIndex) 第一個int為開始的索引,對應String數字中的開始位置, 第二個是截止的索引位置,對應String中的結束位置 1、取得的字串長度為:endIndex - beginIndex; 2、從beginIndex開始取,到endIndex結束,從0開始數,其中不包括endIndex位置的字元 如: "hamburger".substring(4, 8) returns "urge"  "smiles".substring(1, 5) returns "mile" 取長度大於等於3的字串a的後三個子字串,只需a.subString(a.length()-3, a.length());


再附上經典的一個Java字串處理例子,集合了subString和startsWith,endsWith,indexOf用法

public class StringDemo{    
public static void main(String args[]){
      String s1="this is my original string";
      String sd="original";
      if (s1.startsWith(sd)) //startsWith()方法判斷字串s1是否從字串sd開始
         s1=s1.substring(sd.length());
      else
         if(s1.endsWith(sd)) //endWith()方法判斷字串s1是否從字串sd結尾
             s1=s1.substring(0,s1.length()-sd.length());
         else
         {
               int index=s1.indexOf(sd); //indexOf()搜尋字元或子字串首次出現,這裡的index等於11
               if(index!=-1)
               {
                  String s2=s1.substring(0,index); //從字串s1的首字元開始,取index個字元
                  String s3=s1.substring(index+sd.length());//取字串s1的第19個字元後面的字串
                  s1=s2+s3;
               }
               else
               System.out.println("string /""+sd+"/" not found");
         }
         System.out.println(s1);
      }
} 

OK,弄懂上面的,這道題就能很快寫出來了:

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

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

這道題奇怪的就是前導0,如果是0.几几幾,前面的第一個0也要去掉,整數位直接不要了,所以就用substring擷取小數點和小數點之後的。去掉後導0和展開表示(不用科學計數表示)用stripTrailingZeros().toPlainString()就行了。