2018年第九届蓝桥杯Java b组
2018年第九届蓝桥杯Java b组
第一题:第几天
2000年的1月1日,是那一年的第1天。 那么,2000年的5月4日,是那一年的第几天?
注意:需要提交的是一个整数,不要填写任何多余内容。
闰年:四年一闰;百年不闰,四百年再闰。
2000/400 = 5 闰年 31 + 29 + 31 +30 + 4 = 125
第二题:方格记数
如图所示,在二维平面上有无数个1x1的小方格。
我们以某个小方格的一个顶点为圆心画一个半径为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. 复数幂
知识点:
一,虚数
在数学中,虚数就是形如a+b*i的数,其中a,b是实数,且b != 0,i^2 = -1。其中a为虚部,b为实部。i^2 = -1。
二,JAVA大数操作
操作整数:BigInteger
如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作。
BigInteger是在java.math包中。
操作小数:BigDeamal
使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。
对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。
复数运算法则——
(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文件");
这里运行效果如下: