2018第九届蓝桥杯JavaB组省赛-第三题:复数幂

391 阅读2分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

第三题:复数幂

题目描述

设i为虚数单位。对于任意正整数n,(2+3i)^n 的实部和虚部都是整数。 求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示。

答案写成 "实部±虚部i" 的形式,实部和虚部都是整数(不能用科学计数法表示),中间任何地方都不加空格,实部为正时前面不加正号。

(2+3i)^2 写成: -5+12i,

(2+3i)^5 的写成: 122-597i

解题过程

这一题主要的思想就是对于大数的处理。最开始想到的是用递归的,但实际实践一下发现递归的时间太长了,然后忘记了大数的用法就又查了一下大数的用法。

这里的算法是实部设为a和x,虚部设为b和y,其中x用于每次更新的数据,a不变。同理,y用于数据更新,b不变。

(a+bi)^2=(a+bi)(a+bi)=aa+abi+abi+(bb)i^2

其中i^2=-1,所以更新后a=aa-bb,b=ab+ab;

这是2次幂,我们可以不断扩展到123456次幂。

解题要点

  1. Integer的使用方法,其中的加减乘除等操作。

  2. 对于结果的处理,要是用流把结果放在文件中保存。

程序

package day02;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class 复数幂 {

	
	public static void main(String[] args) throws FileNotFoundException {
		
		PrintWriter out =new PrintWriter(new FileOutputStream("1.txt"));
		
		Scanner scanner=new Scanner(System.in);
		
		BigInteger a=BigInteger.valueOf(2);
		BigInteger b=BigInteger.valueOf(3);
		
		BigInteger x=BigInteger.valueOf(2);
		BigInteger y=BigInteger.valueOf(3);
		
		for(int i=2;i<=123456;++i) {
			BigInteger t1=a.multiply(x);
			BigInteger t2=a.multiply(y);
			
			BigInteger t3=b.multiply(x);
			BigInteger t4=b.multiply(y);
			
			x=t1.subtract(t4);
			y=t2.add(t3);
			
		}
		out.print(x.toString()+"+"+y.toString()+"i");
		out.close();
		
		
	}
	
}

结果

image.png