复数幂【2018 蓝桥杯】【第九届】【B组】java

该博客讨论了如何使用BigInteger处理大整数计算,特别是在解决复数幂问题上。作者通过递归函数实现了复数的快速幂运算,以应对蓝桥杯竞赛中的大数挑战。代码示例展示了如何用Java的BigInteger类进行高效计算,并对比了一般幂运算方法的时间效率。
摘要由CSDN通过智能技术生成

复数幂【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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值