我是靠谱客的博主 活力毛豆,最近开发中收集的这篇文章主要介绍java大数运算(BigInteger,BigDecimal)BigDecimal,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java中大数运算非常方便

但要记住一些函数

java中的数学函数要加前缀(相较与c++):Math.

java多组输入:

Scanner in =new Scanner(System.in);
while(in.hasNext()) {//多组输入
//
}

首先是 头文件:import java.math.BigInteger;

BigInteger a =in.nextBigInteger(); 定义一个大数a,并且输入

1.a.add(b);             a+b

2.a.subtract(b);       a-b

3.a.multiply(b);        a*b

4.a.divide(b);           a/b

5.a.remainder(b);     a%b

6.a.gcd(b);               gad(a,b)

7.a!

8.cc.compareTo(dd);  返回int类型(1为>,0为=,-1为<)

BigInteger m;
    	    m =BigInteger.valueOf(1);//BigInteger.valueOf();为定义一个已知大数.
            int x;
            x=in.nextInt();
    	    for(int j=1;j<=x;j++)
    	    {
    	     m=m.multiply(BigInteger.valueOf(j));	
    	    }
        System.out.println(m);	  

完整代码:

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

public class Largenumber {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
     Scanner in =new Scanner(System.in);
     System.out.println("输入两个大数:");
     BigInteger a =in.nextBigInteger();
     BigInteger b =in.nextBigInteger();
     System.out.println("输入操作n1.加法n2.减法n3.乘法n4.除法n5.取余n6.最大公约数n7.求阶乘");
     int n=in.nextInt();
     System.out.println("result:");
     if(n==1)
     {
      System.out.println(a.add(b));	 ///a+b
     }
     else if(n==2)
     {
    	 System.out.println(a.subtract(b));	 ///
     }
     else if(n==3)
     {
    	 System.out.println(a.multiply(b));	  	 ///a*b
     }
     else if(n==4)
     {
    	 System.out.println(a.divide(b));	 	 ///a/b
     }
     else if(n==5)
     {
    	 System.out.println(a.remainder(b));     ///a%b
     }
     else if(n==6)
     {
    	 System.out.println(a.gcd(b));	 	   ///gcd(a,b)
     }
     else                                     ///a!
     {
    	 BigInteger m;
    	    m =BigInteger.valueOf(1);//BigInteger.valueOf();为定义一个已知大数.
            int x;
            x=in.nextInt();
    	    for(int j=1;j<=x;j++)
    	    {
    	     m=m.multiply(BigInteger.valueOf(j));	
    	    }
        System.out.println(m);	    
     }
	}

}

BigDecimal

加:add(BigDecima)

减:subtract(BigDecimal)

乘:multiply(BigDecimal)

除:divide(BigDecimal)

乘方:pow(int)

取绝对值:abs()

取反:negate()

对比:compareTo(BigDecimal)

设置小数点精确度:setScale(int)

设置保留小数点精确度并添加保留方式(直接加1或者四舍五入):setScale(int, int)
     

1、ROUND_UP

舍入远离零的舍入模式。

在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

接近零的舍入模式。

在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING

接近正无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

如果为负,则舍入行为与 ROUND_DOWN 相同。

注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR

接近负无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

如果为负,则舍入行为与 ROUND_UP 相同。

注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。

如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

-----------------------------------------------------------------------

a.setScale(2,BigDecimal.ROUND_HALF_UP )    //a保留两位小数

package abigDecimal;
import java.util.Scanner;
import java.math.BigDecimal;

public class test {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in=new Scanner(System.in);
		BigDecimal a,c;
		int flag=0;
		a=in.nextBigDecimal();
		c=new BigDecimal("0");
	    if(a.compareTo(c)<0)
	    {
	    	flag=1;
	    }
	    if(flag==1){
	    	System.out.print("(");
	    }
	    a=a.abs();
	    System.out.print(a.setScale(2,BigDecimal.ROUND_HALF_UP ));
	    if(flag==1){
	    	System.out.print(")n");
	    }
	}
}

 Strassen

题意:

在本题中,我们只有两种方法计算两个n×n的矩阵的乘积,第一种为定义法,需要n3次乘法和(n−1)n2次加法。第二种为Strassen分治法,仅当n为偶数时可以使用,需要18(n/2)2次加法以及再计算7次大小为(n/2)×(n/2)的矩阵的乘积。这7次更小矩阵的乘积也可以选择两种方法之一计算。现假设计算机计算一次加法需要a单位时间,计算一次乘法需要b单位时间,其他任何操作不花费时间,问计算两个n×n的矩阵的乘积至少需要多少时间。输出答案模109+7的余数。

解析:

我直接用java大数处理

ac:

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

public class Main{
    static BigInteger dfs(BigInteger n,BigInteger a,BigInteger b)
    {
        if(n.equals(BigInteger.valueOf(1)))
        {
            return b;
        }
        BigInteger ans=BigInteger.valueOf(0),res=BigInteger.valueOf(0);
        BigInteger aa=n.pow(3);
        aa=aa.multiply(b);
        BigInteger bb=n.pow(2);
        bb=bb.multiply(n.subtract(BigInteger.valueOf(1)));
        bb=bb.multiply(a);
        ans=aa.add(bb);
        if(n.mod(BigInteger.valueOf(2)).equals(BigInteger.valueOf(0))) {
            BigInteger k=n.divide(BigInteger.valueOf(2));//n/2
            res=k.pow(2);
            res=res.multiply(BigInteger.valueOf(18).multiply(a));
            res=res.add(BigInteger.valueOf(7).multiply(dfs(k,a,b)));
            if(res.compareTo(ans)<0)
                ans=res;
        }
        return ans;
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int t;
        BigInteger n,a,b;
        t=in.nextInt();
        BigInteger gg=BigInteger.valueOf(1000000007);
        while(t!=0)
        {
            n=in.nextBigInteger();
            a=in.nextBigInteger();
            b=in.nextBigInteger();
            BigInteger kk=dfs(n,a,b);
            System.out.println(kk.mod(gg));
            t--;
        }
    }
}

http://codeforces.com/gym/102028/problem/E

题意:

RR=1/(1/R1+1/R2+1/R3+....+1/Rn)

Ri=i,如果i的因子有一个数的二次,Ri就为无穷大

Si={j,i%j==0},Si包含i的所以因子

解析:

为了让RR竟可能的小,呢就就让1/R1+1/R2+....+1/R2,尽可能的大,竟可能的多

=>Ri越小越好,然后Ri的集合有是一个数的因子,呢么如果Ri与Rj相等,呢么Ri*Rj为d^2,无穷大,倒一下->0,白白多加一个因子

再根据测试数据,很容易退出10->1,2,3     选择连续素数的积<=n

1/(1/1+1/2+1/3)=1/2

这里n非常大,用java过

ac:

import javafx.scene.transform.Scale;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;

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

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        int prime[]=new int[1005],k=1;
        prime[1]=1;
        for(int a=2;a<=500;a++){
            int sign=0;
            for(int b=2;b*b<=a;b++){
                if(a%b==0){
                    sign=1;
                    break;
                }
            }
            if(sign==0){
                prime[++k]=a;
            }
        }
        Scanner in=new Scanner(System.in);
        int t;
        t=in.nextInt();
        while(t!=0)
        {
            BigInteger AA,BB,c,EE,DD;
            BB= BigInteger.valueOf(1);
            AA=in.nextBigInteger();
            EE=BigInteger.valueOf(1);
            DD=BigInteger.valueOf(1);
            for(int i=2;i<=k;i++)
            {
                c=BigInteger.valueOf(prime[i]);
                BB = BB.multiply(c);
                if(BB.compareTo(AA)==1){
                    break;
                }
                EE=EE.multiply(c.add(BigInteger.valueOf(1)));
                DD=BB;
            }
            BigInteger gcc=EE.gcd(DD);
            System.out.println(DD.divide(gcc)+"/"+EE.divide(gcc));
            t--;
        }
    }
}

https://vjudge.net/problem/POJ-3101

题意:

n个行星开始在一条直线上且在同一边,问你最少再过多久,他们会再一次全面在同一直线上

解析:

ui=2*π/Ti,选择行星0为参考点,行星i的相对角速度为

t1=(T0*T1)/(2*(abs(T1-T0))

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

public class Main {

    public static void main(String[ ]  args)
    {
        Scanner cin = new Scanner(System.in);
        int n,cnt;
        int [ ] t  =new  int[1100];
        int [ ]s = new int [1100];
        BigInteger a,b,g,mo = null,de = null;
        while(cin.hasNext())
        {
            n = cin.nextInt();
            for(int i = 0;i<n;i++)
                s[i] = cin.nextInt();

            for(int i = 1;i<n;i++)
            {
                a = BigInteger.valueOf(s[i]*s[0]);//t0*t1
                b = BigInteger.valueOf(Math.abs(s[i]-s[0])*2);//2*(t0-t1)
                g =  a.gcd(b);
                if(i == 1)
                {
                    mo = a.divide(g);
                    de = b.divide(g);
                }
                else
                {
                    a  = a.divide(g);
                    b = b.divide(g);
                    mo = mo.multiply(a).divide(mo.gcd(a));
                    de = de.gcd(b);
                }
            }

            System.out.println(mo+" "+de);
        }
        cin.close();
    }
}

 

最后

以上就是活力毛豆为你收集整理的java大数运算(BigInteger,BigDecimal)BigDecimal的全部内容,希望文章能够帮你解决java大数运算(BigInteger,BigDecimal)BigDecimal所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部