Java 大数类

来源:互联网 发布:国立清华大学 知乎 编辑:程序博客网 时间:2024/06/03 17:08

大数阶乘

例如:5000!

代码如下:

import java.io.*;import java.math.BigInteger;import java.util.*;public class Main{public static void main(String args[]){Scanner cin = new Scanner(System.in);int n = cin.nextInt();BigInteger ans = BigInteger.ONE;for(int i = 1; i <= n; ++i)ans = ans.multiply(BigInteger.valueOf(i));System.out.println(ans);}}

棋盘覆盖

在一个2

k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的2×2方格(图2为其中缺右下角的一个),去覆盖2k×2k未被覆盖过的方格,求需要类似图2方格总的个数s。如k=1时,s=1;k=2时,s=5                                                                                

          

输入
第一行m表示有m组测试数据;
每一组测试数据的第一行有一个整数数k;
输出
输出所需个数s;                                                    

代码如下:

import java.math.BigInteger;import java.util.*;import java.io.*;public class Main{public static void main(String args[]){Scanner in = new Scanner(System.in);int test = in.nextInt();while(test-- > 0){int n;n = in.nextInt();BigInteger a = new BigInteger("4");for(int i = 1; i < n; ++i)a = a.multiply(BigInteger.valueOf(4));System.out.println(a.subtract(BigInteger.valueOf(1)).divide(BigInteger.valueOf(3)));}}}

比较大小

给你两个很大的数,你能不能判断出他们两个数的大小呢?

比如123456789123456789要大于-123456

输入

每组测试数据占一行,输入两个不超过1000位的10进制整数a,b

数据保证输入的a,b没有前缀的0。

如果输入0 0表示输入结束。测试数据组数不超过10组

输出

如果a>b则输出“a>b”,如果a<b则输出“a<b”,如果相等则输出“a==b”。

代码如下:

import java.io.*;import java.math.BigInteger;import java.util.*;public class Main{public static void main(String args[]){Scanner cin = new Scanner(System.in);while(cin.hasNext()){BigInteger a = cin.nextBigInteger();BigInteger b = cin.nextBigInteger();if(a.equals(BigInteger.ZERO) && b.equals(BigInteger.ZERO))break;int flag = a.compareTo(b);if(flag == -1)System.out.println("a<b");else if(flag == 0)System.out.println("a==b");elseSystem.out.println("a>b");}}}

大数加法

代码如下:

import java.math.BigInteger;import java.util.*;import java.io.*;public class Main{public static void main(String args[]){Scanner in = new Scanner(System.in);int n = in.nextInt();for(int i = 1; i <= n; ++i){BigInteger a = in.nextBigInteger();BigInteger b = in.nextBigInteger();BigInteger ans = a.add(b);System.out.println("Case " + i + ":");System.out.println(a + " + " + b + " = " +ans);}}}

递推求值

数列A满足An = An-1 + An-2 + An-3, n >= 3

编写程序,给定A0, A1 和 A2, 计算A99

输入

输入包含多行数据

每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 100000000)

数据以EOF结束

输出

对于输入的每一行输出A99的值

代码如下:

import java.io.*;import java.math.BigInteger;import java.util.*;public class Main{public static void main(String args[]){Scanner cin = new Scanner(System.in);BigInteger a[] = new BigInteger[100];while(cin.hasNext()){for(int i = 0; i <= 2; ++i)a[i] = cin.nextBigInteger();for(int i = 3; i <= 99; ++i)a[i] = a[i - 1].add(a[i - 2]).add(a[i - 3]);System.out.println(a[99]);}}}

高精度幂

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 
现在要你解决的问题是:对一个实数R( 0.0< R < 99.999 ),要求写程序精确计算 R n次方(Rn),其中n是整数并且 0 < =n<= 25

输入

输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。

输出

对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。

代码如下:

import java.io.*;import java.math.BigDecimal;import java.util.*;public class Main{public static void main(String args[]){Scanner cin = new Scanner(System.in);while(cin.hasNext()){BigDecimal ans = cin.nextBigDecimal();int n = cin.nextInt();String res = ans.pow(n).stripTrailingZeros().toPlainString(); //整数去掉小数点和后面的0if(res.startsWith("0")) //去掉前导0{res = res.substring(1);}System.out.println(res);}}}