复数幂【2018 蓝桥杯】【第九届】【B组】java
求解(2+3i)^123456
这题是一道填空题。它的关键在于结果异乎寻常的大,哪怕是long也吃不消。所以我们要掌握关于BigInteger的使用,才能计算出答案。
另外,对于幂的运算我们也可以自己编写一个递归函数来进行时间上的优化。
3^10 =3^5 * 3^5=…=(3 * (3^2 * 3^2 ))*(3 * (3^2 * 3^2 ))
忘了这样为啥快了哈哈,你知道的话,还请指教。
代码
package com.flower;
import java.math.BigInteger;
import java.util.*;
public class Main{
static public Imaginary basic=new Imaginary(BigInteger.valueOf(2),BigInteger.valueOf(3));
static public Imaginary recursion(int n){
if(n==1){
return basic;
}
if(n%2==0){
return recursion(n/2).multi(recursion(n/2));
}else{
n--;
return basic.multi(recursion(n));
}
}
public static void main(String[] args) {
int n=100000;//幂数
long start_1=System.currentTimeMillis(); //优化方法
Imaginary imaginary=recursion(n);
System.out.println(imaginary.real);
System.out.println(imaginary.fake);
long end_1=System.currentTimeMillis();
System.out.println(end_1-start_1);
long start_2=System.currentTimeMillis();//一般方法
BigInteger two=BigInteger.valueOf(2);
BigInteger three=BigInteger.valueOf(3);
BigInteger a=BigInteger.valueOf(2);
BigInteger b=BigInteger.valueOf(3);
BigInteger aa=null;
BigInteger bb=null;
for(int i=0;i<n-1;i++){
aa=a.multiply(two).subtract(b.multiply(three));
bb=a.multiply(three).add(b.multiply(two));
a=aa;
b=bb;
}
System.out.println(a);
System.out.println(b);
long end_2=System.currentTimeMillis();
System.out.println(end_2-start_2);
}
}
//虚数类,实现虚数的乘法
class Imaginary{
public BigInteger real;
public BigInteger fake;
Imaginary(BigInteger r,BigInteger f){
real=r;
fake=f;
}
public Imaginary multi(Imaginary ima){
BigInteger new_real=ima.real.multiply(real).subtract(ima.fake.multiply(fake));
BigInteger new_fake=ima.real.multiply(fake).add(ima.fake.multiply(real));
return new Imaginary(new_real,new_fake);
}
}