Java大数

描述

求10000以内n的阶乘。

输入

只有一行输入,整数n(0<=n<=10000)。

输出

一行,即n!的值。

样例输入

100

样例输出

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

这个题目使用Java中大数解题最为简便,代码如下

import java.math.BigInteger;
import java.util.*;
public class Main {
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
     BigInteger n=sc.nextBigInteger();
     BigInteger shu=new BigInteger("1");
    for(BigInteger i=new BigInteger("1");i.compareTo(n)<=0;i=i.add(new BigInteger("1")))
      //如果BigDecimal为小于n返回-1,如果BigDecimal为大于n返回1,如果BigDecimal为等于n返回0
    {
      shu=shu.multiply(i);
      }
    System.out.println(shu);		
 }
}

以下是关于Java大数类用法的:

参考连接:https://blog.csdn.net/zhongkelee/article/details/52289163

https://blog.csdn.net/weixin_39792252/java/article/details/80021540

在java中引入了两个大数的操作类:
操作整型:BigInteger
操作小数:BigDecimal
这些大数都会以字符串的形式传入。

BigInteger

如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。

Ⅰ基本函数:
1.valueOf(parament); 将参数转换为指定的类型
比如 int a = 3;
BigInteger b = BigInteger.valueOf(a);
则b=3;
String s=”12345”;
BigInteger c=BigInteger.valueOf(s);
则c=12345;

2.add(); 大整数相加
BigInteger a=new BigInteger(“23”);
BigInteger b=new BigInteger(“34”);
a. add(b);

3.subtract(); 相减
4.multiply(); 相乘
5.divide(); 相除取整
6.remainder(); 取余
7.pow(); a.pow(b)=a^b
8.gcd(); 最大公约数
9.abs(); 绝对值
10.negate(); 取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.punlic int comareTo();
14.boolean equals(); 是否相等
15.BigInteger构造函数:
一般用到以下两种:
BigInteger(String val);
将指定字符串转换为十进制表示形式;
BigInteger(String val,int radix);
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger
Ⅱ.基本常量:
A=BigInteger.ONE 1
B=BigInteger.TEN 10
C=BigInteger.ZERO 0
以下是示例代码:

import java.math.BigInteger;
 
public class BigIntegerDemo1 {
 
  public static void main(String[] args) {
    BigInteger bi1 = new BigInteger("123456789") ;	// 声明BigInteger对象
    BigInteger bi2 = new BigInteger("987654321") ;	// 声明BigInteger对象
    System.out.println("加法操作:" + bi2.add(bi1)) ;	// 加法操作
    System.out.println("减法操作:" + bi2.subtract(bi1)) ;	// 减法操作
    System.out.println("乘法操作:" + bi2.multiply(bi1)) ;	// 乘法操作
    System.out.println("除法操作:" + bi2.divide(bi1)) ;	// 除法操作
    System.out.println("最大数:" + bi2.max(bi1)) ;	 // 求出最大数
    System.out.println("最小数:" + bi2.min(bi1)) ;	 // 求出最小数
    BigInteger result[] = bi2.divideAndRemainder(bi1) ;	// 求出余数的除法操作
    System.out.println("商是:" + result[0] + 
      ";余数是:" + result[1]) ;
  }
}

发现divide()方法本身只是把最终的商保存下来了,但是这样的两个数字相除的时候肯定是无法整除,肯定存在余数,所以我们在上面代码中还用到了divideAndRemainder()方法来获得结果和余数。

BigDecimal

使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

代码如下:

import java.math.BigDecimal;
 
public class  {
 
  public static void main(String[] args) {
    System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;
    System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;
    System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),4)) ;
    System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;
  }
}
class MyMath{
  public static double add(double d1,double d2){		// 进行加法计算
    BigDecimal b1 = new BigDecimal(d1) ;
    BigDecimal b2 = new BigDecimal(d2) ;
    return b1.add(b2).doubleValue() ;
  }
  public static double sub(double d1,double d2){		// 进行减法计算
    BigDecimal b1 = new BigDecimal(d1) ;
    BigDecimal b2 = new BigDecimal(d2) ;
    return b1.subtract(b2).doubleValue() ;
  }
  public static double mul(double d1,double d2){		// 进行乘法计算
    BigDecimal b1 = new BigDecimal(d1) ;
    BigDecimal b2 = new BigDecimal(d2) ;
    return b1.multiply(b2).doubleValue() ;
  }
  public static double div(double d1,double d2,int len){		// 进行除法计算
    BigDecimal b1 = new BigDecimal(d1) ;
    BigDecimal b2 = new BigDecimal(d2) ;
    return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
  }
  public static double round(double d,int len){	// 进行四舍五入
    BigDecimal b1 = new BigDecimal(d) ;
    BigDecimal b2 = new BigDecimal(1) ; // 技巧
    return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
  }
};

 

发布者

deng

听闻余生久不遇,相逢别错过。

发表评论

电子邮件地址不会被公开。 必填项已用*标注