Java承压计算

在X星球的高科技实验室中,一批珍贵金属原料被堆放成金字塔形,重量精确分布于30台电子秤上。通过递归算法计算,发现读数最小的电子秤示数为2086458231,最终推算出读数最大的电子秤示数为2147483647。

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

【题目】

X星球的高科技实验室中整齐地堆放着某批珍贵金属原料
每块金属原料的外形、尺寸完全一致,但重量不同
金属材料被严格地堆放成金字塔形

  			      7
                             5 8 
                            7 8 8 
                           9 2 7 2 
                          8 1 4 9 1 
                         8 1 8 8 4 1 
                        7 9 6 1 4 5 4 
                       5 6 5 5 6 9 5 6 
                      5 5 4 7 9 3 5 5 1 
                     7 5 7 9 7 4 7 3 3 1 
                    4 6 4 5 5 8 8 3 2 4 3 
                   1 1 3 3 1 6 6 5 5 4 4 2 
                  9 9 9 2 1 9 1 9 2 9 5 7 9 
                 4 3 3 7 7 9 3 6 1 3 8 8 3 7 
                3 6 8 1 5 3 9 5 8 3 8 1 8 3 3 
               8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9 
              8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4 
             2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9 
            7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6 
           9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3 
          5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9 
         6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4 
        2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4 
       7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6 
      1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3 
     2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8    
    7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9   
   7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6   
  5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1    
 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X   

其中的数字代表金属块的重量(计量单位较大)
最下一层的X代表30台极高精度的电子秤
假设每块原料的重量都十分精确地平均落在下方的两个金属块上
最后,所有的金属块的重量都严格精确地平分落在最底层的电子秤上
电子秤的计量单位很小,所以显示的数字很大
工作人员发现,其中读数最小的电子秤的示数为:2086458231
请你推算出:读数最大的电子秤的示数为多少?

【分析】
本题可以通过一个二维数组来存储每块的重量,而后通过一个简单的递归来把每一层每一块的重量平均分散到下一层的两块身上
创建一个double[30][30]的二维数组,然后第一层1块金属,第二层2个,3,4…,第三十层是电子称
最后输出最后一层电子秤的重量发现最小的只有3.8863313030451536,最大是135.34946863353252,首先检查一遍代码对错,是正确的
那么就只有一种情况,单位不一样,需要我们转换一下单位,接下来请先看代码演示

【代码演示】

import java.util.Scanner;

class Main {
    // 储存重量的二维数组,初始值是0.0
    static double[][] num = new double[30][30];

    public static void main(String[] args) {
        Scanner sr = new Scanner(System.in);
        // 将二维数组里1到29行递增填入值
        for (int i = 0; i < 29; i++) {
            for (int j = 0; j <= i; j++) {
                num[i][j] = sr.nextDouble();
            }
        }
        // 运行递归方法
        helper(0);
        // 创建接收最大值和最小值的变量
        double min = num[29][0], max = num[29][0];
        // 找出最大重量和最小重量
        for (int k = 0; k < 30; k++) {
            if (num[29][k] < min) min = num[29][k];
            if (num[29][k] > max) max = num[29][k];
        }
        // 转换单位:最大重量/最小*题中给的最小重量
        System.out.println();
        System.out.printf("%d", (int) (max / min * (double) 2086458231));
    }

    static void helper(int i) {
        // 当到29层就停止
        if (i == 29) {
            return;
        }
        // 将每一层每一个数除2分别给下一层的当前坐标和下一层的后一位坐标
        for (int j = 0; j < i + 1; j++) {
            num[i + 1][j] += num[i][j] / 2;
            num[i + 1][j + 1] += num[i][j] / 2;
        }
        // 层数+1
        i++;
        helper(i);
    }
}

【再次分析】

转换单位公式:最大重量/最小*题中给的最小重量,除了用到转换单位,还需要格式化输出,因为最大质量单位转换之后非常大,直接输出是16进制,所以需要对结果格式化输出System.out.printf("%d", (int) (max / min * (double),"%d"的意思是对整数类型以10进制输出,后面的除乘法是转换单位

【答案是2147483647】

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Oak Coffee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值