【Java】-BigInteger大数类的使用【超强Java大数模板 总结】

Scanner cin = new Scanner(new BufferedInputStream(System.in));

这样定义Scanner类的对象读入数据可能会快一些!

参考这个博客继续补充内容:http://blog.csdn.net/lmyclever/article/details/6408980

 

1. 单元变量常用大数操作:

import java.util.Scanner;
import java.math.*;

public class Main{
	
	public static void main(String args[]){
		Scanner cin= new Scanner(System.in);
		//使用Sacnner类创建cin对象
		BigInteger a, b;//创建大数对象
		while(cin.hasNext()){
			a=cin.nextBigInteger();
			b=cin.nextBigInteger();
			System.out.println("a+b="+a.add(b));
			
			System.out.println("a-b="+a.subtract(b));
			
			System.out.println("a*b="+a.multiply(b));
			
			System.out.println("a/b="+a.divide(b));
			
			System.out.println("a%b="+a.remainder(b));
			
			if(a.compareTo(b)==0) //比较两数的大小
				System.out.println("a==b");
			else if(a.compareTo(b)>0)
				System.out.println("a>b");
			else 
				System.out.println("a<b");
			
			System.out.println(a.abs());//取绝对值
			
			int e=10;
			System.out.println(a.pow(e));//求a^e
			
			System.out.println(a.toString()); //将大数a转字符串输出
			
			int p=8;
			System.out.println(a.toString(p)); //将大数a转换成p进制后 按字符串输出
			
		}
	}
}

 2.java大数 实现递推公式:f[i]=f[i-1]+f[i-2]*2 

 

 

import java.util.*;
import java.math.*; //导入类

public class Main{
    static BigInteger[] ans; //定义全局变量
    public static void main(String[] args){

        Scanner reader=new Scanner(System.in);
        //定义Scanner类对象

        ans = new BigInteger[251]; //定义ans大数数组的大小

        ans[0]=BigInteger.valueOf(1);//大数赋初值
        ans[1]=BigInteger.valueOf(1);
        ans[2]=BigInteger.valueOf(3);
        for(int i=3; i<=250; i++)
        {
            ans[i] = ans[i-1].add(ans[i-2].multiply(BigInteger.valueOf(2)));
        }  //大数加法的使用
        int n;
        while(reader.hasNextInt()){
            n=reader.nextInt();
            System.out.println(ans[n]); //普通输出
        }
    }
}

3. HDOJ 1047 Integer Inquiry

 T组大数,每组数据输入直到0终止,计算刚才输入的数之和。数字会很大。

java code:(注意:BigInteger.ZERO 和 普通的0不同,这在java代码里面要体现出来 )

import java.util.Scanner;
import java.math.*;

public class Main{
	
	public static void main(String args[]){
		Scanner cin = new Scanner(System.in);
		int tg; tg=cin.nextInt();
		
		while(tg>0){
			BigInteger cur, sum;
			sum=BigInteger.ZERO; //
			while(cin.hasNext()){
				cur=cin.nextBigInteger();
				if(cur.equals(BigInteger.ZERO)) break; //判断是不是0 
				sum=sum.add(cur); //不断累加
			}
			System.out.println(sum);
			if(tg!=1)
				System.out.println();
			tg--;
		}
	}
}

 4.hdu 1753 大明A+B (两个超长的浮点类型数求和)使用java BigDecimal类 并且将结果转为字符串输出

code:

import java.util.Scanner;
import java.math.BigInteger;
import java.math.BigDecimal;

public class Main{
	
	public static void main(String args[]){
		Scanner cin = new Scanner(System.in);
		BigDecimal a, b, ans;
		while(cin.hasNext()){
			a=cin.nextBigDecimal();
			b=cin.nextBigDecimal();
			ans=a.add(b);
			String s=ans.stripTrailingZeros().toPlainString();
			System.out.println(s);
		}
	}
}

 5.  HDU 1715  (java计算1000以内的斐波那契数列)

code:

package java_1;
import java.util.Scanner;
import java.math.BigInteger;
import java.math.BigDecimal;

public class Main{
	
	public static void main(String args[]){
		Scanner cin = new Scanner(System.in);
		BigInteger f[];
		f=new BigInteger[1100];
		
		f[1]=f[2]=BigInteger.valueOf(1);
		for(int i=3; i<=1000; i++){
			f[i]=f[i-1].add(f[i-2]);
		}
		
		int tg; tg=cin.nextInt();
		int n;
		for(int i=0; i<tg; i++){
			n=cin.nextInt();
			System.out.println(f[n]);
		}
	}
}

 6. HDU 1063 Exponentiation (计算一个a的b次方, a是一个长浮点数, b是整数)

输出时,如果结果是0.XXXXXX  这时候前面的0要忽略掉不输出。

代码:

import java.util.Scanner;
import java.math.BigDecimal;
import java.math.BigIntege;

public class Main{
	
	public static void main(String args[]){
		Scanner cin = new Scanner(System.in);
		
		BigDecimal a, ans;
		int n, i;
		while(cin.hasNext()){
			a=cin.nextBigDecimal();
			n=cin.nextInt();
			ans=BigDecimal.valueOf(1);
			for(i=1; i<=n; i++)
				ans=ans.multiply(a);
			String s=ans.stripTrailingZeros().toPlainString();
			if(s.startsWith("0."))//如果开头是0.XXX 从下标1开始输出
				System.out.println(s.substring(1));
			else
				System.out.println(s);
		}
	}
}

 7. java大数实现计算阶乘,本以为很简单,写起来之后却发现了不少自己的能力问题。

    (1)java BigInteger只能和大数的类型相运算,不能和int等进行运算。

    (2)强制类型装换:int先转换成String类型,在转换成BigInteger类型。

code:

import java.util.Scanner;
import java.math.BigDecimal;
import java.math.BigInteger;

public class Main{
	
	public static void main(String args[]){
		Scanner cin = new Scanner(System.in);
		
		BigInteger ans;
		ans=BigInteger.valueOf(1);
		int n;
		n=cin.nextInt();
		
		for(int i=2; i<=n; i++){
			String temp=Integer.toString(i);
			BigInteger t=new BigInteger(temp);
			ans = ans.multiply(t);
		}
		
		System.out.println(ans);
	}
}

 

8. HDU 4762 Cut the Cake

输出:n/( m^(n-1) ) ,  m^(n-1)是个大数,并且最后这个分式要化简。

import java.util.Scanner;
import java.math.BigInteger;

public class Main{
	
	public static void main(String args[]){
		
		Scanner cin=new Scanner(System.in);
		
		int m, n;
		int tg; tg=cin.nextInt();
		for(int cnt=0; cnt<tg; cnt++){
			m=cin.nextInt(); 
			n=cin.nextInt();
			String temp=Integer.toString(m);
			BigInteger cur=new BigInteger(temp);
			BigInteger ans=cur.pow(n-1);//
			
			temp=Integer.toString(n);
			BigInteger nn=new BigInteger(temp);
			if(nn.mod(ans).equals(BigInteger.valueOf(0))){
				System.out.println(nn.divide(ans));
			}
			else{
				System.out.print(nn.divide(ans.gcd(nn)) + "/");
				System.out.println(ans.divide(ans.gcd(nn)));
			}
		}
	}
}

 

posted @ 2015-08-07 11:18  我喜欢旅行  阅读(1245)  评论(0编辑  收藏  举报