【代码+详解】算法题 : 细菌繁殖

❗注意:
下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果 代码和详解 看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答.

❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!!

题目

一种细菌的繁殖速度是每天成倍增长。例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。

Input
第一行有一个整数n,表示测试数据的数目。其后n行每行有5个整数,整数之间用一个空格隔开。第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的数目,第四个数表示要求的那一天的月份,第五个数表示要求的那一天的日期。已知第一天和要求的一天在同一年并且该年不是闰年,要求的一天一定在第一天之后。数据保证要求的一天的细菌数目在长整数(long)范围内。

Output
对于每一组测试数据,输出一行,该行包含一个整数,为要求的一天的细菌数。


样例

输入
2
1 1 1 1 2
2 28 10 3 2
输出
2
40


代码

//细菌繁殖
import java.util.Scanner;
public class Main02{
  public static void main(String[] args){
      Scanner scanner = new Scanner(System.in);
      int n = scanner.nextInt();
      int[] arr = {31,28,31,30,31,30,31,31,30,31,30,31};
      for(int i = 0;i<n;i++){
          int beginM = scanner.nextInt();
          int beginD = scanner.nextInt();
          int beginN = scanner.nextInt();
          int endM = scanner.nextInt();
          int endD = scanner.nextInt();
          Long totalN = totalNumbers(beginM,beginD, endM, endD, arr, beginN);
          System.out.println(totalN);
  
      }
  }
public static Long totalNumbers(int beginM,int beginD,int endM,int endD,int[] arr,int beginN ){
  int totalDays = 0;
  if(endM-beginM==0){
          totalDays = endD-beginD;
  }else{
      totalDays+=arr[beginM-1]-beginD;
      totalDays+=endD;
     for (int i = beginM; i < endM-1; i++) {
      totalDays+=arr[i];
     }
  }

 Long endN = (long) beginN;
  for (int i = 0; i < totalDays; i++) {
      endN*=2;
  }
  return endN;
}

}

详解

初步思路

这道题目是关于细菌繁殖的数量计算问题。细菌每天数量成倍增长,问题是给定起始日期、起始细菌数量和结束日期,计算结束日期的细菌数量。可以通过计算日期间的天数差,然后利用细菌数量的指数增长规律来解决。

具体步骤

  1. 输入解析

    • 读取测试数据的数量n。
    • 对于每组测试数据,读取5个整数,分别是第一天的月份、日期、细菌数目,以及要求计算的那一天的月份和日期。
  2. 计算天数差

    • 根据每个月的天数列表,计算从第一天到要求那一天的天数差。
    • 如果起始月和结束月相同,直接计算天数差。
    • 如果起始月和结束月不同,计算起始月剩余天数,加上中间月份的天数,再加上结束月的天数。
  3. 计算细菌数量
    根据天数差计算细菌数量:每天细菌数量成倍增长,使用公式最终细菌数 = 初始细菌数 * 2^天数差 计算最终的细菌数量。

分步作答

  1. 初始化和输入读取
    读取n,表示测试数据组数。
    定义每个月的天数列表:int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  2. 处理每组测试数据
    读取第一天和要求那一天的数据:int beginM = scanner.nextInt(); int beginD = scanner.nextInt(); int beginN = scanner.nextInt(); int endM = scanner.nextInt(); int endD = scanner.nextInt();

    • 计算天数差:

      int totalDays = 0;
      if (endM == beginM) {
          totalDays = endD - beginD;
      } else {
          totalDays += daysInMonth[beginM - 1] - beginD; // 起始月剩余天数
          totalDays += endD; // 结束月的天数
          for (int i = beginM; i < endM - 1; i++) {
              totalDays += daysInMonth[i]; // 中间月份的天数
          }
      }
      
  3. 计算细菌数量
    利用天数差计算细菌数目:

    Long endN = (long) beginN;
    for (int i = 0; i < totalDays; i++) {
        endN *= 2;
    }
    

总结方法

通过以上步骤,可以高效地计算在指定日期的细菌数量。关键在于准确计算日期之间的天数差,然后利用指数增长公式计算细菌数量。这种方法的启发在于它能够解决类似的指数增长问题,例如金融中的复利计算和生物学中的细胞增长等。掌握日期计算和指数增长公式,可以应用于各种实际问题的解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值