大数:
BigInteger 和 BigDecimal分别表示大整数类和大浮点数类。
这两个类都在java.math.*包中,因此每次必须在开头处引用该包
一、大数的基本运算:以整数为例实现 BigInteger
1.)输入:
BigInteger a = in.nextBigInteger();
或者:BigInteger b = new BigInteger(in.next());
2.)两个大数相加: a.add(b);
3.) 两个大数相减: a.subtract(b);
4.) 相乘: a.multiply(b);
5.)相除取整 a.divide(b)
6.)取余,两种表示 a.mod(b) = a%b = a.remainder(b)
7.)幂运算a^c a.pow(c);//c为Int整数
8.)a,b的最大公约数 a.gcd(b)
9.)一个数的绝对值 a.abs()
10.)取反数 a.negate()
11.)最大max最小min 两者取大小 a.max(b) a.min(b)
12.)判断大小 a.compareTo(b) :如果a == b 输出0;如果a < b 输出-1;如果a > b输出1。(int型)
13.)判断是否相等 :a.equals(b) 如果相等输出true , 否则输出false(Boolean类型)
14.)//常量,可以初始化用
System.out.println(BigInteger.ONE); //1
System.out.println(BigInteger.ZERO); //0
System.out.println(BigInteger.TEN); //10
15.)将大数转换成不同的进制数:,toString(p); //没有P默认为十进制,否则自定义
//返回大整数十进制的字符串表示,十进制也可以用下面的表示即p = 10,
System.out.println(a.toString()); //结果是字符串
System.out.println(b.toString()); //结果是字符串
//返回大整数p进制的字符串表示
int p = 10;
System.out.println(a.toString(p)); //结果是字符串
System.out.println(b.toString(p)); //结果是字符串
16.)//将别的类型的数转换成大数。(某些问题可能会用到大数,但是一开始并不是大数,这时就需要转化。比如:例题SDUT3899)
// int型或者long型用BigInteger.valueOf(k),浮点型用BigDecimal.valueOf(k)
//浮点型转化
double k = 13.156;
System.out.println(BigDecimal.valueOf(k));
//整型转换成大数
int c = in.nextInt();
System.out.println(BigInteger.valueOf(c));
//长整型转换c成大数
long l = 213513L;
System.out.println(BigInteger.valueOf(l));
17.)//将BigInteger类型转换成别的类型:
//doubleValue() ,将此 BigInteger 转换为 double
System.out.println(a.doubleValue());
System.out.println(b.doubleValue());
//intValue() ,将此 BigInteger 转换为 int
System.out.println(a.intValue());
System.out.println(b.intValue());
//floatValue(),将BigInteger转换为float型
System.out.println(a.floatValue());
System.out.println(b.floatValue());
//longValue(),将BigInteger转换为long型
System.out.println(a.longValue());
System.out.println(b.longValue());
18.)//nextProbablePrime() ; 返回大于此BigInteger的可能为素数的第一个整数。
System.out.println(a.nextProbablePrime());
System.out.println(b.nextProbablePrime());
二、 浮点数处理问题:
1)输出原始结果(自己计算得出的结果):
BigDecimal result;
两种方法:
法一:System.out.println(result); //直接输出
法二:System.out.println(result.toString()); //
这两种结果是一样的,大部分使用第二个。但是,toString()方法输出的字符串并不能保证不是科学计数法。不过在日常的使用中,用toString()方法输出的就是普通的数字字符串而非科学计数法。
举个例子:
System.out.println(new BigDecimal("100.000"));
结果为:100.000
System.out.println(new BigDecimal("0000.14541"));
结果为:0.14541
如果想要把浮点数末尾的0去掉,那么就用下面的方法。
2)处理浮点数时去掉末尾的0:
一种方法:用.stripTrailingZeros().toString();
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
但是这种方法会表示成科学计数法的形式,上面的结果为:1E+2。而我们不希望要这样的结果,而是直接输出100,那么要怎么做呢?
解决的方法很简单,如果想要避免输出科学计数法的字符串,我们要用toPlainString()函数代替toString()。后面多余的0都会删掉。
如:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
结果为:100
在上面的所有方法中如果带有String结果都是字符串类型的,
.toString()
.stripTrailingZeros().toString()
.stripTrailingZeros().toPlainString()
如果要将结果赋值给一个新的变量,那一定是String类型的字符串。
3)去掉开头的0,开头只有一个0;
String s = result.stripTrailingZeros().toPlainString();
if(s.startsWith("0")) //去掉首位的0
s = s.substring(1); //减掉一位
s.subString();的用法是对字符串进行的操作;
举例:
String s = "123456";
String s1 = s.substring(3); //在原字符串的基础上减掉三位
System.out.println("s1= " + s1); //结果为:s1 = 456
* 如果前面有多个0,输出的时候只输出一个。
* 而后面有多个0:
* 用.toString();会输出带0的,在位数限制内(超过多少位会变成科学计数法吧???)。
* 用.stripTrailingZeros().toString();会输出科学技术法表示的数也是在某个范围之外,与toString()一样
* 用.stripTrailingZeros().toPlainString();会将末尾的多余的0去掉