题目
问题描述
w星球的长老交给小明一个任务:
1,2,3…16 这16个数字分为两组。
要求:
这两组数字的和相同,
并且,两组数字的平方和也相同,
并且,两组数字的立方和也相同。
请你利用计算机的强大搜索能力解决这个问题。
并提交1所在的那个分组的所有数字。
这些数字要从小到大排列,两个数字间用一个空格分开。
即类似:1 4 5 8 … 这样的答案。
注意,只提交这一组数字,不要填写任何多余的内容。
笨笨有话说:
只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。
凭直觉,两个组的成员数目不会差太多吧。
歪歪有话说:
既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。
貌似都是8个成员的可能性很大啊。
解题思路
1、暂时没想到好的方法。只能暴力了。
//java代码
static int [][] nums=new int[16][2];//创建一个二维数组用来保存1-16平方和立法映射避免重复计算
//第一个下标0-15对应着1-16,第二个下标0-1,0对应着平方,1对应着立方。
public static void main(String[] args) {
int square=0;//保存平方和
int cube=0;//保存立方和
//建立映射 和获取square,cube
for (int i = 0; i <16 ; i++) {
int x=i+1;
nums[i][0]=x*x;
square+= nums[i][0];
nums[i][1]=x*x*x;
cube+=nums[i][1];
}
square/=2;//分成两组且平方和也相同故/2
cube/=2;//分成两组且立方和也相同故/2
//暴力
for (int i = 1; i <16 ; i++) {
for (int j = 2; j <16 ; j++) {
for (int k = 3; k <16 ; k++) {
for (int l = 4; l <16 ; l++) {
for (int m = 5; m <16 ; m++) {
for (int n = 6; n <16 ; n++) {
for (int o = 7; o <16 ; o++) {
int []group={0,i,j,k,l,m,n,o};//建立数组保存值,方便求和
int []sums=getSum(group);//获取平方和,立方和
if (sums[0]==square&&cube==sums[1]) {//相等输出结果
for (int z:group
) {
System.out.print(z+1+" ");//输出结果
}
return;
}
}
}
}
}
}
}
}
}
//返回一个长度为2的数组,sums[0]保存的是传入数组的平法和,sums[1]保存的是立方和
public static int[] getSum(int []group){
int []sums=new int[2];
for (int i = 0; i <group.length ; i++) {
sums[0]+=nums[group[i]][0];
sums[1]+=nums[group[i]][1];
}
return sums;
}
```