Java解决高精度问题

Poj1131 

题意: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 }
View Code

 

=================================================================================

 POJ 1205

 题意:现在有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 }
View Code

 

==============================================================================

Poj 1220

题意:

给出

posted @ 2013-08-07 20:09  Griselda.  阅读(2176)  评论(0)    收藏  举报