java刷题-蓝桥技能树5、6

微生物增殖

题目

原题链接:(10条消息) 技能树答题 (csdn.net)

假设有两种微生物 X 和 Y

X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。

一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。

现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。

如果X=10,Y=90呢?

本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

问题分析

//本题的要求就是写出两种初始条件下,60分钟后Y的数目。

//吞吃节点 0,0.5,1,1.5,2,2.5…,是包含了两种变化

//而其对应的下标为0,1,2,3,4,5…,对应到单位时间来说

//在与下标的除法中,%2的余数为1就减(比如1,3,5…),

//在%4与%6余数为0的时候,y与x分别翻倍(4,6,8,12,…)

//因为涉及半分钟的变化,所以将30s作为单位时间

//通过七月末取模,确定变化节点

思路通过循环,和if分支判断来实现

代码实现

x=10, y=89

public static void main(String[] args) {
        int x=10,y=89;
        //进入循环 
        for (int i = 1; i < 121; i++) {
            
            if(i%2==1) {
                y -=x ;//y数量,
            }
            if (i%4==0){
                y*=2;//两分钟y翻倍
            }
            if(i%6==0){
                x*=2;//三分钟x翻倍
            }
            System.out.println("第"+i+"单位时间");
            System.out.print("x:"+x);
            System.out.println("y:"+y);
            
        }

代码如图,经过对比讨论区和其他博主的答案,可以确定这个给条件下y会小

成绩统计

题目

原文链接:(12条消息) 技能树答题 (csdn.net)

问题描述

编写一个程序,建立了一条单向链表,每个结点包含姓名、学号、英语成绩、数学成绩和C++成绩,并通过链表操作平均最高的学生和平均分最低的学生并且输出。

输入格式

输入n+1行,第一行输入一个正整数n,表示学生数量;接下来的n行每行输入5个数据,分别表示姓名、学号、英语成绩、数学成绩和C++成绩。注意成绩有可能会有小数。

输出格式

输出两行,第一行输出平均成绩最高的学生姓名。第二行输出平均成绩最低的学生姓名。

样例输入

2
yx1 1456787
yx2 2889099

样例输出

yx2
yx1

问题分析

需要扫扫描器确定学生数量。每个学生的数据然后统一处理

所以需要一个循环次数为n的(n为学生数量)的循环,录入数据

需要对所有学生进行平均值的计算,然后排序,

排序可以用冒泡排序,也可以通过数学函数来请确定一个数组的最大值。

if判断需要在循环內部才可以使用,但每次循环输入,不能确定最值,所以需要每次循环更新最值

成绩可能是小数,那么就需要float或者double类型的数据

、代码实现

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        
        String Max = "";                         // 成绩最高
        String Min = "";                         // 成绩最低
        double maxavg = Integer.MIN_VALUE;       // 最大平均值
        double minavg = Integer.MAX_VALUE;       // 最小平均值
        for (int i = 0; i < n; i++) {
            String name = scanner.next();        // 姓名
            String id = scanner.next();          // 学号
            int English = scanner.nextInt();     // 英语
            int Math = scanner.nextInt();          // 数学
            int Ccc = scanner.nextInt();         // C++
            double avg = (English + Math + Ccc) / 3;   // 平均成绩
            if (maxavg < avg) {                  // 最大平均值<平均成绩
                Max = name;                      // 最大值=姓名
                maxavg = avg;                    // 最大平均值=平均成绩
            }
            if (minavg > avg) {                  // 最小平均值>平均成绩
                Min = name;                      // 最小值=姓名
                minavg = avg;                    // 最小平均值=平均成绩
            }
            
        }
        scanner.close();
        System.out.println(Max);                 // 输出成绩最高者
        System.out.println(Min);                 // 输出成绩最低者

    }

输出效果如下,解决问题!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CLODVEP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值