zoukankan      html  css  js  c++  java
  • 【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)));
    			}
    		}
    	}
    }
    
  • 相关阅读:
    八皇后(回溯经典)
    高精度阶乘(大数运算)
    跳棋(利用规范的数学方法)
    贪心砝码(分治法)
    大数乘方取余
    二分法查找
    汉诺塔(经典递归)(未完全明白)
    斐波那契数列和
    实验 7: OpenDaylight 实验——Python 中的 REST API 调用
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发流表
  • 原文地址:https://www.cnblogs.com/yspworld/p/4710215.html
Copyright © 2011-2022 走看看