爱java_爱生活,爱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 classMain4 {5 public static voidmain(String[] args)6 {7 Scanner cin = newScanner(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 classMain5 {6 public static voidmain(String[] args)7 {8 Scanner cin = new Scanner(newBufferedInputStream(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

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 classMain5 {6 public staticBigInteger gcd(BigInteger a,BigInteger b)7 {8 return b.compareTo(new BigInteger("0"))==1?gcd(b,a.mod(b)):a;9 }10 public static voidmain(String[] args)11 {12 Scanner cin = new Scanner(newBufferedInputStream(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 classMain

{public static voidmain(String[] args)

{

Scanner cin= new Scanner(newBufferedInputStream(System.in));intn;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 classMain5 {6 public static voidmain(String[] args)7 {8 Scanner cin = new Scanner (newBufferedInputStream(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 classMain5 {6 public static voidmain(String[] args)7 {8 Scanner cin = new Scanner (newBufferedInputStream(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 classMain5 {6 public static voidmain(String[] args)7 {8 Scanner cin = new Scanner (newBufferedInputStream(System.in));9 String s;10 int ss[] = new int[10000];11 intT,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 intx;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 chard;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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值