Java解决高精度问题
题意:8进制的小数转换为10进制的大数
思路:因为小数很大,如果用c++做就是用一个字符串存输入的数,然后我们知道8进制转换成10进制方法是a0*(8^0)+a1*(8^1)+...+an*(8^n),而8进制的小数转换成10进制的小数就是a0*(8^0)+a1*(8^-1)+a2*(8^-2)+...an*(8^-n),但是这样的话8^-n次方double也存不下。
然后其实可以把这个看成是从最后一个/8加上前一个的和再除以8,即如果是0.123 就变成0.((3/8+2)/8+1)/8,后面那一部分直接看成整数部分去求解,但是有时候可能除不尽,譬如第一个样例:0.75 就先用5/8看一下是否能除尽,如果不能就50/8,再不能就500/8,再不能就5000/8,5000/8 = 625,然后加上前一个数变成7625,然后用试除法发现7625000/8=953125,所以答案就是0.953125。
但是显然这样其实很麻烦,所以用java的高精度。直接用一开始的思路,BigDecimal可以存下8^-n。
Tips:在acm中常用的while (cin.hasNext()) 等同于 while(EOF != scanf(""))
BigDecimal是大的小数的意思。
如果是整数可以直接用
String st = Integer.toString(num, base); // 把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的进制.
解决。
Code:
1 import java.io.*; 2 import java.util.*; 3 import java.math.*; 4 5 public class Main { 6 public static void main(String[] args) { 7 Scanner cin = new Scanner(new BufferedInputStream(System.in)); 8 BigDecimal num, tmp, eight; 9 eight = new BigDecimal(8); 10 while (cin.hasNext()) { 11 num = new BigDecimal(0); 12 tmp = new BigDecimal(1); 13 String str = cin.next(); 14 for (int i = 2; i < str.length(); ++i) { 15 tmp = tmp.divide(eight); 16 num = num.add(tmp.multiply(new BigDecimal(str.charAt(i)-'0'))); 17 } 18 System.out.println(str + " [8] = " + num.toString() + " [10]"); 19 } 20 } 21 }
=================================================================================
题意:现在有n个城市和一条河平行,每个城市有三种处理污水的方式:
排到右边的城市 >
排到左边的城市 <
排到河里 |
现在已知有n座城市,问你总共有几种排污水的方式。
思路:
如果增加了一个城市i,则第i个城市的排水有3种方案,一种是>| 即 第i-1个城市的水排到第i个城市,然后第i个城市把这些水都排到河里。
一种是 | 即 第i-1个城市的水自己处理,第i个城市只把自己的水排到河里。
一种是 < 即 第i个城市把自己的水排到第i-1个城市,然后第i-1个城市选择把水排到河里或者排到i-2的城市。
对于第一种方案,第i-1个城市的水可以排到第i个城市的时候,第i-1个城市的水只可能是>| 和 | 的方案变成了 >>| 和 >|, 即第i-1个城市的水不自己排到河里全部变成排到第i个城市。
对于这种情况,方案数为dp[i-1]-dp[i-2],即除去第i-1个城市的第三种方案外的方案数。
第二种方案和第三种方案的方案数都取决于第i-1个城市的总排水方案数
由上述分析可得,dp[i] = 3*dp[i-1]-dp[i-2]
Code:
1 import java.io.*; 2 import java.util.*; 3 import java.math.*; 4 5 public class Main { 6 public static void main(String[] args) { 7 int n; 8 Integer a = new Integer(0); 9 Scanner cin = new Scanner(new BufferedInputStream(System.in)); 10 BigInteger[] arr = new BigInteger[110]; 11 arr[0] = new BigInteger(a.toString()); 12 a = new Integer(1); 13 arr[1] = new BigInteger(a.toString()); 14 a = new Integer(3); 15 arr[2] = new BigInteger(a.toString()); 16 for (int i = 2; i < 110; ++i) 17 arr[i] = arr[i-1].multiply(new BigInteger(a.toString())).subtract(arr[i-2]); 18 while (cin.hasNext()) { 19 n = cin.nextInt(); 20 System.out.println(arr[n]); 21 } 22 } 23 }
==============================================================================
题意:
给出

浙公网安备 33010602011771号