六.素数筛法
素数:只能被自身和1整除的大于1的正整数。
确定一个数是否是素数:
在[2,sqrt(n)]中,所有正整数均不能整除n,则可以判定n为素数。
时间复杂度:O(sqrt(n))
素数筛法:
从2开始遍历2到1000000的所有整数,若当前整数没有因为它是某一个小于它的素数的倍数而被标记为非素数,则判定其为素数,并标记所有它的倍数为非素数。然后继续遍历下一个数,直到遍历完2到1000000区间内所有的整数。此时,所有没有被标记成非素数的数字即为我们要求的素数。这种算法称为素数筛法。
七.分解素因数
对一个数 x 分解素因数,即确定素数p1,p2,p3,...pn,使得,必要时还需要确定e1,e2,e3,...en.
对正整数n分解素因数的步骤:
1.有素数筛法求出[1,sqrt(n)]区间内所有的素数
2.对素数进行遍历。若某一个素数模n为0,则不断将n除以该素数,直至无法整除,同时计算器幂指数
3.若在完成某个素数的幂指数计算后,n==1,则不必再测试之后的素数,分解素因数提前结束
4.若遍历、分解、测试完所有的素数后,n仍旧没有被除为1,则说明n存在一个大于sqrt(n)的因数,其必为素因数且其幂指数为1.
BTW,当得出整数n的所有素因数的幂指数后,可以得出该整数的所有因数的个数为:(e1+1)*(e2+1)*(e3+1)*...*(en+1)
八.二分求幂
快速求得a的b次方。
将b进行二进制转换得到b的二进制数,假设b==5,因为:,所以有:
,则有:
。根据此方法,可以将求a的b次方转为求a的1次方与a的4次方的乘积。
九.高精度整数
BigInteger类:https://docs.oracle.com/javase/8/docs/api/
BigDecimal类:https://docs.oracle.com/javase/8/docs/api/