题目链接:http://poj.org/problem?id=1001
题目意思:输入实数R和次数n,输出pow(R,n)? 0.0 < R < 99.999 0 < n <= 25
分析:数据规模很小,直接n次R的乘法,不会C++大数,暴力都没A过,然后就试java了,java不知道double有没有,于是用BigInteger做,然后移动小数位。第一发RE了,在测试10.000 2的时候,发现问题了。
import java.math.BigInteger;
import java.util.Scanner;
public class main {
static BigInteger ten=new BigInteger("10");//常量
static BigInteger zero=new BigInteger("0");
public static void main(String args[])
{
String s;
int n;
Scanner cin = new Scanner(System.in);//输入申明
while(cin.hasNext()){//文件结束
s=cin.next();
n=cin.nextInt();
BigInteger num=zero;
int len=s.length();
int cnt=0;
for(int i=0;i<len;i++){//将字符串转为BigInteger,并且记录小数位个数
String tmp="";
tmp+=s.charAt(i);
if(tmp.equals(".")){
cnt=len-i-1;
}else{
BigInteger flag= new BigInteger(tmp);
num=num.multiply(ten).add(flag);
}
}
BigInteger res=num;
for(int i=1;i<n;i++){//次方运算
res=res.multiply(num);
}
cnt=cnt*n;
if(cnt==0){//不含小数,直接输出
System.out.println(res);
}else{
BigInteger a[] = new BigInteger[10000];
int k=0;
//去后导0,注意cnt!=0,最多只能去掉小数位个后导0
while(cnt!=0&&res.mod(ten).equals(zero)){
res=res.divide(ten);
cnt--;
}
//保存数
while(!(res.equals(zero))){
a[k++]=res.mod(ten);
res=res.divide(ten);
}
//不够,补0
for(;k<cnt;k++){
a[k]=zero;
}
for(int i=k-1;i>=cnt;i--){
System.out.print(a[i]);
}
if(cnt!=0)
System.out.print(".");
for(int i=cnt-1;i>=0;i--){
System.out.print(a[i]);
}
System.out.println();
}
}
}
}
方法二:直接使用java中BigDecimal
import java.math.*;
import java.util.Scanner;
public class main {
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);//输入申明
while(cin.hasNext()){//文件结束
BigDecimal num = cin.nextBigDecimal();
int n = cin.nextInt();
BigDecimal tmp=num;
for(int i=1;i<n;i++){
num=num.multiply(tmp);
}
//System.out.println(num);该句是以科学计数法输出
String s = num.stripTrailingZeros().toPlainString();
//先去除后缀0,在转为字符串输出。
if(s.charAt(0)=='0'){//或则s.startsWith("0");
s = s.substring(1);//如果前缀是0,那么切掉前缀0
}
System.out.println(s);
}
}
}<strong>
</strong>