第八届蓝桥杯决赛JAVA语言 C组题解_题 2 数字划分

JAVA语言决赛 C组题解_题 2 数字划分

题目

问题描述
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;
    }
	```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值