天天看點

poj 1001 Exponentiation(高精度乘法)

Exponentiation

Time Limit: 500MS  Memory Limit: 10000K

Total Submissions: 64208  Accepted: 15055

Description

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.

Output

The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.

Sample Input

95.123 12

0.4321 20

5.1234 15

6.7592  9

98.999 10

1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721

.00000005148554641076956121994511276767154838481760200726351203835429763013462401

43992025569.928573701266488041146654993318703707511666295476720493953024

29448126.764121021618164430206909037173276672

90429072743629540498.107596019456651774561044010001

1.126825030131969720661201

經常會有變态的題目用到高精度,而實際上高精度也确實是惡心。。寫起來容易出錯不說編碼複雜度也是超大。

但是java就不一樣了。自帶的大數處理BigDecimal真是友善。不過java的string類處理實在是太麻煩了。

全部都需要函數來幹。比如切割啦String.substring(int,int)開始和結尾。String.lastIndexOf("")查找字元串。

然後定位。不過比c++還是簡單了許多。

A_C code

import java.math.BigDecimal;

import java.io.*;

import java.text.DecimalFormat;

import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner cin=new Scanner(System.in);

while(cin.hasNext())

{

String a=cin.next();

int b=cin.nextInt();

BigDecimal f=new BigDecimal(a);

BigDecimal g=new BigDecimal("1");

for(int i=1;i<=b;i++)

{

g=g.multiply(f);

}

BigDecimal y=new BigDecimal(0);

if( g.compareTo(y)==0)

System.out.println("0");//等于0時

else{

String result;

result=g.toPlainString();

int pos;

int is=1;

pos=result.lastIndexOf(".");

for(int i=pos-1;i>=0;i--)//前導零的處理

{

if(result.charAt(i)!='0')

is=0;

}

if(is==1)//需要切割

{

result= result.substring(pos, result.length());

// System.out.println(result);

}

is=-1;

pos=result.lastIndexOf(".");

if(result.charAt(result.length()-1)=='0')

for(int i=result.length()-1;i>pos;i--)

{

if(result.charAt(i)=='0')

{

is=i;

}

else break;

}

if(is!=-1)

if(is!=pos+1)

result=result.substring(0, is);

else result=result.substring(0,is-1);

System.out.println(result);

}

// String result=g.toPlainString();

}

}

}