爱生活,爱JAVA,爱大数

  

  几道水题,练习一下JAVA写大数

   http://www.apihome.cn/api/java/BigInteger.html  //有关BigInteger类的方法,感觉很不错

  poj2305  Basic remains

  大数可以直接用非十进制读入,读入的数在变量中是十进制的

  输出的时候要先用BigInteger的toString方法转换为相应的进制

 1 import java.math.*;
 2 import java.util.*;
 3 class Main
 4 {
 5     public static void main(String[] args)
 6     {
 7         Scanner cin = new Scanner(System.in);
 8         while(true)
 9         {
10             int b = cin.nextInt();
11             if(b==0)break;
12             BigInteger p = cin.nextBigInteger(b);
13             BigInteger m = cin.nextBigInteger(b);
14             String s = p.mod(m).toString(b);
15             System.out.println(s);
16         }
17     }
18 }

   

  poj1131Octal Fractions

  小数没有按进制读入的构造,所以一开始天真了。。

  明明知道了做法,还是要实践一下,要不当中有许多发现不了的小问题

  

 1 import java.util.*;
 2 import java.math.*;
 3 import java.io.*;
 4 class Main
 5 {
 6     public static void main(String[] args)
 7     {
 8         Scanner cin = new Scanner(new BufferedInputStream(System.in));
 9         String s;
10         final BigDecimal e = new BigDecimal(8);
11         while(cin.hasNext())
12         {
13             s = cin.next();
14             BigDecimal ans = new BigDecimal(0);
15             BigDecimal t = new BigDecimal(1);
16             for(int i = 2;i<s.length();++i)
17             {
18                 t = t.divide(e);
19                 ans = ans.add(t.multiply(new BigDecimal(s.charAt(i)-'0')));
20             }
21             System.out.println(s+" [8] = "+ans+" [10]");
22 
23         }
24     }
25 
26 }

 

  

    HDU5050 Divided Land

  上海网赛时的一道水题,只要用大数求个GCD即可,只不过JAVA和C++有很多不同的地方,写起来细节需要注意下

  这题很充分的利用了JAVA的大数和进制转换,如果用C++写应该会很麻烦

 1 import java.util.*;
 2 import java.math.*;
 3 import java.io.*;
 4 class Main
 5 {
 6     public static BigInteger gcd(BigInteger a,BigInteger b)
 7     {
 8         return b.compareTo(new BigInteger("0"))==1?gcd(b,a.mod(b)):a;
 9     }
10     public static void main(String[] args)
11     {
12         Scanner cin = new Scanner(new BufferedInputStream(System.in));
13         int T = cin.nextInt();
14         BigInteger a,b;
15         for(int i = 1;i<=T;++i)
16         {
17             a = cin.nextBigInteger(2);
18             b = cin.nextBigInteger(2);
19             a = gcd(a,b);
20             String s = a.toString(2);
21             System.out.println("Case #"+i+": "+s);
22         }
23     }
24 
25 }

 

  POJ1001 Exponentiation

  题意非常明确就是求R的n次方

  要求不能有后导0,如果小数是0.###的形式,第一个0也不能输出

  新用到的类方法有

  BigDecimal 的 BigDecimal stripTrailingZeros()  去除大数的后面无用的零并放回相应的值

  BigDecimal 的 String toPlainString() 将BigDecimal的大数转换为字符串,与toString 不用的地方是多了一个Plain,然后这个方法的特殊地方就是可以将用科学计数法表示的大数,转换成正常表示法的字符串,当然正常表示的大数也可以用此方法

  String 的char charAt(int pos) 返回String 当中pos位置的字符,String和字符数组一样下标也是从0开始

  String 的boolean startsWith(String s) 检查原字符串是否是以s开头

  String 的String substring (int from)  返回原string的以from开头的子string,注意这里的substring第二个s并非大写。而且substring应该还有几种重载的方式,这里就先不想了

  

import java.util.*;
import java.math.*;
import java.io.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int n;
        while(cin.hasNext())
        {
            BigDecimal r ,ans = new BigDecimal(1);
            r = cin.nextBigDecimal();
            n = cin.nextInt();
            for(int i = 1;i<=n;++i)ans = ans.multiply(r);
            ans = ans.stripTrailingZeros();
            String s = ans.toPlainString();
            if(s.startsWith("0."))s = s.substring(1);
            //等同于 s.charAt(0)=='0' && s.charAt(1)=='.'
            System.out.println(s);
        }
    }
}

     POJ2389 Bull Math

    超水 只用一乘法方法

    

 1 import java.util.*;
 2 import java.math.*;
 3 import java.io.*;
 4 public class Main
 5 {
 6     public static void main(String[] args)
 7     {
 8         Scanner cin = new Scanner (new BufferedInputStream(System.in));
 9         BigInteger a,b;
10         while(cin.hasNext())
11         {
12             a = cin.nextBigInteger();
13             b = cin.nextBigInteger();
14             System.out.println(a.multiply(b));
15         }
16     }
17 }

   poj1503 Integer Inquiry

  水题,只用个加法

  

 1 import java.util.*;
 2 import java.math.*;
 3 import java.io.*;
 4 public class Main
 5 {
 6     public static void main(String[] args)
 7     {
 8         Scanner cin = new Scanner (new BufferedInputStream(System.in));
 9         BigInteger ans = new BigInteger("0"),a;
10         while(true)
11         {
12             a = cin.nextBigInteger();
13             if(a.compareTo(new BigInteger("0"))==0)break;
14             ans = ans.add(a);
15         }
16         System.out.println(ans);
17     }
18 }

   poj1220 NUMBER BASE CONVERSION

  大概意思就是要实现2-62进制之间的任意转换,但JAVA 提供的只有35进制以内的,一开始一直想不通为什么是35而不是别的,现在算是知道了,我也就呵呵了。。(字母+数字)

  还是要靠手动把数字进行进制转换,而且JAVA写的时候到处都是类啊方法啊,还是习惯不了,还是多练吧

  这题有坑,当结果是0的时候就会有一点小问题,WA了好久

  这次学到了 BigInteger 的静态方法  BigInteger.valueOf()  用于将基本类型的数转换成大整数

  

  上代码

  

 1 import java.util.*;
 2 import java.math.*;
 3 import java.io.*;
 4 class Main
 5 {
 6     public static void main(String[] args)
 7     {
 8         Scanner cin = new Scanner (new BufferedInputStream(System.in));
 9         String s;
10         int ss[] = new int[10000];
11         int T,base_1,base_2;
12         T = cin.nextInt();
13         for(int k = 1;k<=T;++k)
14         {
15             base_1 = cin.nextInt();
16             base_2 = cin.nextInt();
17             s = cin.next();
18             BigInteger temp = BigInteger.valueOf(base_1);
19             BigInteger t = BigInteger.valueOf(1);
20             BigInteger ans = BigInteger.valueOf(0);
21             for(int i = s.length()-1;i>=0;--i)
22             {
23                 int x;
24                 if(s.charAt(i)>='A' && s.charAt(i)<='Z')x = s.charAt(i)-'A'+10;
25                 else if(s.charAt(i)>='0' && s.charAt(i)<='9')x = s.charAt(i)-'0';
26                 else x = s.charAt(i)-'a'+36;
27                 ans = ans.add(t.multiply(BigInteger.valueOf(x)));
28                 t = t.multiply(temp);
29             }
30             System.out.println(base_1+" "+s);
31             System.out.print(base_2+" ");
32             int cnt = 0;
33             while(ans.compareTo(BigInteger.valueOf(0))==1)
34             {
35                 ss[cnt++] = ans.mod(BigInteger.valueOf(base_2)).intValue();
36                 ans = ans.divide(BigInteger.valueOf(base_2));
37             }
38             if(cnt==0)System.out.print(0);
39             for(int i = cnt-1;i>=0;--i)
40             {
41                 char d;
42                 if(ss[i]>=36 && ss[i]<=62)d = (char)(ss[i]-36+'a');
43                 else if(ss[i]>=0 && ss[i]<=9)d = (char)(ss[i]+'0');
44                 else d = (char)(ss[i]-10+'A');
45                 System.out.print(d);
46             }
47             System.out.println();
48             System.out.println();
49 
50         }
51     }
52 }

 

  

 

posted on 2014-11-08 22:33  round_0  阅读(191)  评论(0编辑  收藏  举报

导航