爱生活,爱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 }