题意:求c的n次幂……要求保留所有小数……
解法:一开始只知道有BigInteger……java大数+模拟。第一次写java大数……各种报错各种exception……ORZ
没有前导0和小数后面的补位0,整数的话不输出小数点,wa点就这些···被整数后面的小数点坑死了···
代码:
放渣代码……
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); while(cin.hasNext()) { String s; int n; s = cin.next(); n = cin.nextInt(); String s1 = ""; int len = s.length(); int x = -1; for(int i = 0; i < len; i++) { if(s.charAt(i) != '.') s1 += s.charAt(i); else x = i; }//去掉输入中的小数点,并记录小数点出现在第几位 BigInteger ans = new BigInteger(s1); ans = ans.pow(n);//计算去小数点后的整数的n次幂 if(x == -1)//如果没出现小数点说明输入是整数 System.out.println(ans); else { x = 5 - x;//计算小数点后有几位 x *= n;//计算积的小数点后有几位 boolean flag = false; String s2 = ans.toString(); len = s2.length(); String res = ""; for(int i = len - 1, j = 0; (i >= 0) || (j < x); i--, j++)补小数点并去掉多余的0 { if(i < 0) res += '0'; else { if(s2.charAt(i) == '0') { if(flag) res += s2.charAt(i); } else { res += s2.charAt(i); flag = true; } } if(j + 1 == x) { if(flag) res += '.'; flag = true; } } flag = false; len = res.length(); for(int i = len - 1; i >= 0; i--) { if(res.charAt(i) == '0')//去前导0 { if(flag) System.out.print(res.charAt(i)); } else { System.out.print(res.charAt(i)); flag = true; } } System.out.println(""); } } } }
后来!有人告诉我还有BigDecimal!直接哭晕在厕所!
代码:
import java.math.*;import java.util.*;public class Main{ public static void main(String args[]) { Scanner cin = new Scanner(System.in); BigDecimal ans; int n; while(cin.hasNext()) { ans = cin.nextBigDecimal(); n = cin.nextInt(); ans = ans.pow(n); String res = ans.stripTrailingZeros().toPlainString(); if(res.charAt(0) != '0') System.out.print(res.charAt(0)); int len = res.length(); for(int i = 1; i < len; i++) System.out.print(res.charAt(i)); System.out.println(); } }}
嗯~一开始输出发现有的小数变成了科学计数法~学到两个函数
BigDecimal.stripTrailingZeros()去掉后面多余的0
BigDecimal.toPlainString()用来展开科学计数法