蓝桥杯 复数幂
题目要求:
设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。
求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示。
正确答案:因为数字过大,导致数字显示不出来,所以需要IO流将数字传入到文件中显示
因为这一次数字过大已经超过了9位数字,甚至可以超过Long类型的范围,所以int long已经满足不了我们的运算,所以我们需要涉及新的概念,BigInteger这个类,首先它不是基本数据类型之一,不能进行简单的加减乘除运算,取而代之,可以用一些方法代替他们,比如add()加法 subtract()减法 mutiply()乘法 divide()除法,其次它其实更像String,是Java里的一个类,然而它的初始化方式却没有String那么方便可以直接赋值,而是跟其他自定义的类一样,要调用它的构造器进行初始化。这个类的取值范围原则上是没有上限的,取决于你的计算机的内存,这也是我们需要用到的地方
分析:
其实整体思路,很简单,只不过就是利用for循环,将复数进行123455次相乘即可,
这是两个复数相乘的公式,等会我们会用到,最后算出结果,利用Io流传送到文件中即可,代码如下:
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;
public class App_33 {
//(a+bi)*(c+di)=(ac-bd)+(ad+bc)i
//(2+3i)*(2+3i)=(2*2-3*3)+(2*3+3*2)i
public static void main(String[] args) throws IOException {
BigInteger a = new BigInteger("2");
BigInteger b = new BigInteger("3");
BigInteger c = new BigInteger("2");
BigInteger d = new BigInteger("3");
BigInteger e = new BigInteger("2");
for(int i =1;i<=123455;i++){
e=a;
//a*c-b*d
a= a.multiply(c).subtract(b.multiply(d));
//a*d+b*c
b= e.multiply(d).add(b.multiply(c));
}
//利用IO流,发送到该地址下的文件中
FileWriter writename = new FileWriter("src/bi.txt");
//如果b是正数,则需要我们自己添加加号
//如果b是负数,则它会自动添加负号
if(b.compareTo(BigInteger.ZERO)>=0){
writename.write(a+"+"+b+"i");
}else{
writename.write(a+""+b+"i");
}
writename.flush();
}
}
最后的结果,博主也不展示了,因为实在是太大了,感兴趣小伙伴可以看一下它到底是几位数,可以自己手动查一下哟