前言
文章目录
2018年第九届蓝桥杯JavaB组省赛-第三题:复数幂
🔊题目描述
设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。
求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示。
答案写成 “实部±虚部i” 的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号。(2+3i)^2 写成: -5+12i,
(2+3i)^5 的写成: 122-597i
注意:需要提交的是一个很庞大的复数,不要填写任何多余内容。
🥇代码示例
package E_lanqiao;
import java.math.BigInteger;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
/*
* 1.复数的相乘,主要难的思考点在一个i*i=-1,而关键的思考点在于:
* 实部与虚部区分开来进行计算,然后进行相对应的变量代换,就变得很简单。
* 2.因为是很大的数相乘,所以需要用BigInteger来进行存储,相应地,调用的
* 方法也是BigIngeter类包装的方法。
*/
BigInteger aBigInteger = new BigInteger("2");
BigInteger bBigInteger = new BigInteger("3");
BigInteger cBigInteger = new BigInteger("2");
BigInteger dBigInteger = new BigInteger("3");
String ansString = Mu(aBigInteger, bBigInteger, cBigInteger, dBigInteger);
System.out.println(ansString);
scan.close();
}
private static String Mu(BigInteger aBigInteger,BigInteger bBigInteger,BigInteger cBigInteger,BigInteger dBigInteger) {
BigInteger sbBigInteger = new BigInteger("0");
BigInteger xbBigInteger = new BigInteger("0");
int N = 123456;
while(N > 0) {
sbBigInteger = aBigInteger.multiply(cBigInteger).subtract(bBigInteger.multiply(dBigInteger));
xbBigInteger = aBigInteger.multiply(dBigInteger).add(bBigInteger.multiply(cBigInteger));
// 因为实现的是对复数(2+3i)的幂次方乘积,所以将一个复数的实部以及虚部的值进行更换即可。
cBigInteger = sbBigInteger;
dBigInteger = xbBigInteger;
N--;
}
return sbBigInteger+""+xbBigInteger+"i";
}
}
大数操作的用法
BigInteger
操作大整数
BigDemical
可以指定小数的保留数位
① 这些大数(包括整数&小数),一般都会以字符串的形式传入。
② BigInteger以及BigDemical都在Math包下。
👏小结
这题重要的是要认识到算出来结果这个整数很庞大,即使用long来存储也会产生溢出的情况,所以要用BigInteger来存储,引申到BigInteger类以及BigDemical类的使用。