Java小白学习笔记3——相对进阶的操作(完结)

主要是应对一些数字的处理。一个是Math类里面的各种操作,还有就是能代替C++里面的高精度运算的BigInteger。

其实本来学Java的初衷就是想掌握它的高精度运算,通过这几天的学习我发现Java是真的不适合ACM这种竞速的比赛,它的规矩比C++多得多,但是当某些特殊时刻我需要大数进行处理时Python又不太尽如人意(比如去年的山师停训赛,有一个题打表可做但是不可行),于是就想着学一下Java。


数学运算

Java里面定义了常用的数学常量,比如PI和自然对数底数e,也许能用到。(其实一般用到这种数的题都会直接给出值的)。需要的时候直接使用Math.PI或者Math.E就可以。

Java里面Math类的方法都是static形式,所以应用起来比较方便。以下函数的参数和返回值均为double类型。

首先是三角函数,包括常用的sin,cos,tan,还有反三角函数asin,acos,atan。三角函数的参数都是以弧度制的,也就是1°=π/180弧度。所以Java给出了角度和弧度互相转化的函数,即toRadians(),角度转弧度,还有toDegrees(),弧度转角度。但是要注意,这两个转换函数是不太精确的。

然后是指数对数。比如exp(x),它返回e(自然对数底数)的x次幂。log(a)是以e为底数的对数,也就是ln a。还有log10(a),也就是常用对数lg a。emmm如果需要其他底数的话请使用换底公式。

sqrt()都知道,这个是开平方。还有一个cbrt()是开立方。然后是pow(a, b)用来取a的b次方。

取整操作。ceil()舍掉小数进一,floor()舍掉小数,rint()返回与参数最接近的整数,如果两个同为整数且同样接近则取偶数。round()将参数+0.5后返回与参数最近的整数。long round()与round相同,转换后会将结果强制转换成长整型。

取最值操作。max,min还有绝对值abs,这些函数在Java都是有的。

随机数

(也许可以拿来造数据?233)

Math类有一个random方法,它用来产生一个0到1之间的随机数。其实只需要对这个函数进行一些运算,就可以得到任意区间内的随机数。

比如:

(int)(Math.random()*n)返回一个大于0小于n的整数

m + (int)(Math.random()*n)返回一个大于等于m且小于m+n(m+n取不到)的随机数

其他的比如像是需要随机偶数,随机质数这种的……都可以基于此来自己实现。

实际上,Java还提供了一种Random类,全名叫java.util.Random。它通过实例化一个对象来创建一个随机数生成器。像这样:Random r = new Random(); 这里r就是一个Random对象。以这种方式实例化对象时,Java编译器以系统当前时间作为随机数种子,因为每时每刻的时间不可能相同,所以产生的随机数也不会是相同的,除了……运行速度太快。这里的随机种子也是可以自己定义的,写在参数里就好。

这个对象里面的一些常用方法。比如r.nextInt(),返回一个随机整数,加上一个参数n就是大于等于0且小于n的随机整数。r.nextLong()返回一个随机长整型值,可以加参数限定范围。r.nextBoolean()返回一个随机布尔值。r.nextFloat()返回一个随机单精度浮点数值,r.nextDouble()返回一个双精度浮点数值。emmm还有一个比较奇怪的是r.nextGaussian(),是返回一个概率密度为高斯分布的双精度浮点数值,我不知道这是什么东西。。。。

大数运算(高精度计算)

厌倦了C++大数的繁琐模板和Python大数的慢如蜗牛?来尝试一下Java的大叔运算吧。Java中提供了大数字的操作类,也就是java.math.BigInteger类,用于高精度计算。同时Java提供了java.math.bigDecimal类,用于高精度小数计算。

高精度小数计算这里暂时不考虑。

BigInteger类支持任意精度的整数运算,并且该类型支持多种操作,除了最基本的加减乘除之外,还提供了绝对值,相反数,最大公约数以及判断质数等操作。

构造一个BigInteger的基础是十进制数字字符串。初始化语句是这样写的:

BigInteger bignum = new BigInteger(String s);

一旦创建了对象实例,就可以调用BigInteger类中的一些方法进运算操作,包括基本的数学运算和位运算,以及一些其他操作。但是要注意,这些运算都是建立在方法的基础上进行的,也就是说并不能简单的使用运算符。形式都是类似于a.fun(b)这样的,这里给出各种操作的名字以及用途。

  • add 加法运算
  • subtract 减法运算
  • multiply 乘法运算
  • divide 除法运算
  • remainder 取余运算
  • 特殊:BigInteger[] divideAndRemainder(BigInteger val),结果返回一个数组,第一个值是相除之商,第二个值是余数。
  • pow 参数是int型,进行乘方运算
  • negate 取相反数
  • compareTo 数字比较
  • equals 结果返回一个bool类型,当参数值与实例的值相等时返回true
  • min 返回较小值
  • max 返回较大值
  • 位运算暂不考虑。

总结

Java的学习应该就到此为止了。其实也只算是入了一点门而已,真正的核心内容还没有接触到。由于精力的限制其实并不能学太多内容,Java的核心技术,比如接口,继承,多态,异常处理,多线程,网络通信,数据库操作,表格,布局管理器,绘图,音视频播放,打印等高级用法暂时还未能学到。这里提前挖好一个坑,相信在可以预期的未来里我能够接触到此类相关内容,让Java最终变成我手中的另一项强而有力的武器。

下学期学院开设程序设计基础课程,据说是要学C++,如果有幸能讲到面向对象,那我就可以把以前的欠账补回来了,当年面向对象没学好,现在学啥也没法很深入。

后续的话,ACM训练赛将陆续开始启动,生活可能又会回到原来天天刷题那样。反正不像蓝桥杯那样会限制语言,后续的比赛上期待Java能为我发挥一些比较重要的作用,补足C++的部分缺陷。


-------------本文结束,感谢您的阅读转载请注明原作者及出处-------------


本文标题:Java小白学习笔记3——相对进阶的操作(完结)

文章作者:Shawn Zhou

发布时间:2019年01月13日 - 16:01

最后更新:2019年01月18日 - 19:01

原始链接:http://shawnzhou.xyz/2019/01/13/19-01-13-01/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

知识无价,码字不易。对您有用,敬请打赏。金额随意,感谢关心。
0%