2018年第九届蓝桥杯Java b组

2018年第九届蓝桥杯Java b组

第一题:第几天

2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天?

注意:需要提交的是一个整数,不要填写任何多余内容。

闰年:四年一闰;百年不闰,四百年再闰。

2000/400 = 5 闰年 31 + 29 + 31 +30 + 4 = 125

第二题:方格记数

如图所示,在二维平面上有无数个1x1的小方格。

image-20220321195239923

我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。 你能计算出这个圆里有多少个完整的小方格吗?

注意:需要提交的是一个整数,不要填写任何多余内容。

解题思路:

以圆的圆心为坐标原点,半径所在直线为横轴和纵轴,将圆划分为四个象限。计算出一个象限内的方块个数再*4即可。

设a,b为最远的方块的长度,r为圆的半径长。最远的方块的的顶点一定不会超过圆的半径因此\(a^2+b^2<=r^2\)

package 蓝桥杯历年习题2018;

import java.util.Iterator;

public class Q2 {
	
	public static void main(String args[]) {
		int count = 0;
		for(int x = 1;x<=1000;x++) {
			for (int y = 1; y <= 1000; y++) {
				if(x*x+y*y<=1000*1000) {
					count++;
				}
			}
		}
		System.out.println(count*4);
	}

}

答案是:

3137548

3. 复数幂

image-20220321203733847

知识点:

一,虚数

在数学中,虚数就是形如a+b*i的数,其中a,b是实数,且b != 0,i^2 = -1。其中a为虚部,b为实部。i^2 = -1。

二,JAVA大数操作

操作整数:BigInteger

如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。

BigInteger是在java.math包中。

image-20220321203825957

操作小数:BigDeamal

使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

image-20220321203842779

复数运算法则——

(a+bi)(c+di)=(ac-bd)+(bc+ad)i;

(2+3i)(2+3i) = (\(2*2-3*3\))+(6+6)i = -5+12i

有公式:

(A+Bi)(a+bi)

=Aa+Abi+aBi-Bb

=(Aa-Bb)+(Ab+aB)i

令A=(Aa-Bb),B=(Ab+aB),继续迭代和2+3i相乘,一共迭代123455次即可。

package 蓝桥杯历年习题2018;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.math.BigInteger;

public class Q3 {
	public static void main(String[] args) throws FileNotFoundException {
//
//		(A+Bi)(a+bi)
//
//		=Aa+Abi+aBi-Bb
//
//		=(Aa-Bb)+(Ab+aB)i
//
//		令A=(Aa-Bb),B=(Ab+aB)
		
		PrintStream ps = new PrintStream(new FileOutputStream("result2.txt"));
		
		System.setOut(ps);
		
		BigInteger a = BigInteger.valueOf(2);
		BigInteger b = BigInteger.valueOf(3);
		
		BigInteger A = BigInteger.valueOf(2);
		BigInteger B = BigInteger.valueOf(3);
		
		for (int i = 1; i <= 123455; i++) {
			
			
			BigInteger newA = A.multiply(a).subtract(B.multiply(b));
			
			BigInteger newB = A.multiply(b).add(a.multiply(B));
			
			A = newA;
			B = newB;
			
		}
		System.out.println(A+""+(B.compareTo(BigInteger.ZERO)>0 ? ("+"+B):B)+"i");
	
		
		

	}
}

这里主要考察BigInteger的操作以及字符串写入文件

PrintStream out = System.out;//保留原输入流
PrintStream ps = new PrintStream(new FileOutputStream("test1.txt"));//创建文件输出流
System.setOut(ps);//使用新的文件输出流
int [] test = {1,2,3,4,5};
for(int i : test) {
    System.out.println(i);
}

System.setOut(out);//又重新回到控制台
//重定位到屏幕输出应该不会再把system.out的内容写入文件了
System.out.println("程序运行完毕请查看test文件");

这里运行效果如下:

image-20220324150129473
posted @ 2022-03-24 15:03  记录学习Blog  阅读(71)  评论(0编辑  收藏  举报