标题:平方十位数
由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网格上推演,并非只有题目中画出的那点空间。
当然,对于遥远的位置,其初始状态一概为死细胞。
注意:需要提交的是一个整数,不要填写多余内容。