蓝桥杯第八届国赛(java)

博客围绕蓝桥杯第八届国赛Java题目展开,重点讲述了‘平方十位数’题,作者起初理解错题意,编程时因不同类型强转出现精度问题,还提到同学用空间换时间的思路解题,给出答案9814072356,此外还提及‘生命游戏’题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:平方十位数

由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。

比如:1026753849,就是其中最小的一个平方数。

请你找出其中最大的一个平方数是多少?

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

刚开始做的时候理解错题意了,应该是最大的数字且,他是一个平方数
在做的时候,因为写了一个函数来判断他是不是平方数,而导致int double long之间转换时精度方面出了问题。

一定注意 不同类型之间强转时的精度问题

public class _1 {
	static long max = -1;
	public static void main(String[] args) {
			for(int i0=0;i0<=9;i0++) {
			for(int i1=0;i1<=9;i1++) {
				for(int i2=0;i2<=9;i2++) {
					for(int i3=0;i3<=9;i3++) {
						for(int i4=0;i4<=9;i4++) {
							for(int i5=0;i5<=9;i5++) {
								for(int i6=0;i6<=9;i6++) {
									for(int i7=0;i7<=9;i7++) {
										for(int i8=0;i8<=9;i8++) {
											for(int i9=0;i9<=9;i9++) {
									
												if(pan(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9)==1) {
													//System.out.println(i0+" "+i1+" "+i2+" "+i3+" "+i4+" "+i5+" "+i6+" "+i7+" "+i8+" "+i9);
												long sum = (long) (i0*Math.pow(10, 9)+i1*Math.pow(10, 8)+i2*Math.pow(10, 7)+i3*Math.pow(10, 6)+i4*Math.pow(10, 5)+i5*Math.pow(10, 4)+i6*Math.pow(10, 3)+i7*Math.pow(10, 2)+i8*Math.pow(10, 1)+i9);
												//System.out.println(sum);
													if(max<Pingfangshu(sum)) {
														//System.out.println(max);
														max = Pingfangshu(sum);
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(max);

	}

	private static long Pingfangshu(long s) {
		// TODO Auto-generated method stub
		double temp = Math.sqrt(s);
		System.out.println("t"+temp);
		long t = (long)temp;
		System.out.println(t);
		if((t*t) == s) {
			return s;
		}else {
			return 0;
		}
	}

	private static int pan(int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, int i9) {
		// TODO Auto-generated method stub
		if(i0!=i1&&i0!=i2&&i0!=i3&&i0!=i4&&i0!=i5&&i0!=i6&&i0!=i7&&i0!=i8&&i0!=i9) {
			if(i1!=i2&&i1!=i3&&i1!=i4&&i1!=i5&&i1!=i6&&i1!=i7&&i1!=i8&&i1!=i9) {
				if(i2!=i3&&i2!=i4&&i2!=i5&&i2!=i6&&i2!=i7&&i2!=i8&&i2!=i9) {
					if(i3!=i4&&i3!=i5&&i3!=i6&&i3!=i7&&i3!=i8&&i3!=i9) {
						if(i4!=i5&&i4!=i6&&i4!=i7&&i4!=i8&&i4!=i9) {
							if(i5!=i6&&i5!=i7&&i5!=i8&&i5!=i9) {
								if(i6!=i7&&i6!=i8&&i6!=i9) {
									if(i7!=i8&&i7!=i9) {
										if(i8!=i9) {
											return 1;
										}
									}
								}
							}
						}
					}
				}
			}
		}
		return 0;
	}
}

emmmm 这十层循环就知道代码质量很低了。。。
还有另外一个同学给我改代码时重新写了一边(他采用 用空间换时间,开辟了一个1000000的数组来存储所有的平方数,之后再判断是不是十个数字只出现一次,一定要多学会这种思想!!!)

public class _1 {
	static long max = -1;
	public static void main(String[] args) {
		
		BigInteger a[] = new BigInteger[1000001];
		for(int i=1;i<1000001;++i) {
			a[i] = BigInteger.valueOf(i).pow(2);
//			System.out.println(a[i]);
		}
		int cnt[][] = new int[1000001][10];
		for(int i=1000000;i>0;--i) {
			BigInteger tmp = a[i];
			int flag = 1;
			for(int j=0;j<10;++j) {
				if(!tmp.toString().contains(String.valueOf(j)))
					flag = 0;
			}
			if(flag == 1 && tmp.toString().length() == 10) {
				System.out.println(a[i]);
				break;
			}
		}
	}
	}

答案是: 9814072356

标题:生命游戏


康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。  
这个游戏在一个无限大的2D网格上进行。

初始时,每个小方格中居住着一个活着或死了的细胞。
下一时刻每个细胞的状态都由它周围八个格子的细胞状态决定。

具体来说:

1. 当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
2. 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
3. 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
4. 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)

当前代所有细胞同时被以上规则处理后, 可以得到下一代细胞图。按规则继续处理这一代的细胞图,可以得到再下一代的细胞图,周而复始。

例如假设初始是:(X代表活细胞,.代表死细胞)
.....
.....
.XXX.
.....

下一代会变为:
.....
..X..
..X..
..X..
.....

康威生命游戏中会出现一些有趣的模式。例如稳定不变的模式:

....
.XX.
.XX.
....

还有会循环的模式:

......      ......       ......
.XX...      .XX...       .XX...
.XX...      .X....       .XX...
...XX.   -> ....X.  ->   ...XX.
...XX.      ...XX.       ...XX.
......      ......       ......


本题中我们要讨论的是一个非常特殊的模式,被称作"Gosper glider gun":

......................................
.........................X............
.......................X.X............
.............XX......XX............XX.
............X...X....XX............XX.
.XX........X.....X...XX...............
.XX........X...X.XX....X.X............
...........X.....X.......X............
............X...X.....................
.............XX.......................
......................................

假设以上初始状态是第0代,请问第1000000000(十亿)代一共有多少活着的细胞?

注意:我们假定细胞机在无限的2D网格上推演,并非只有题目中画出的那点空间。
当然,对于遥远的位置,其初始状态一概为死细胞。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值