❗注意:
下列题我全部都使用 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;
}
}
详解
初步思路
这道题目是关于细菌繁殖的数量计算问题。细菌每天数量成倍增长,问题是给定起始日期、起始细菌数量和结束日期,计算结束日期的细菌数量。可以通过计算日期间的天数差,然后利用细菌数量的指数增长规律来解决。
具体步骤
-
输入解析
- 读取测试数据的数量n。
- 对于每组测试数据,读取5个整数,分别是第一天的月份、日期、细菌数目,以及要求计算的那一天的月份和日期。
-
计算天数差
- 根据每个月的天数列表,计算从第一天到要求那一天的天数差。
- 如果起始月和结束月相同,直接计算天数差。
- 如果起始月和结束月不同,计算起始月剩余天数,加上中间月份的天数,再加上结束月的天数。
-
计算细菌数量
根据天数差计算细菌数量:每天细菌数量成倍增长,使用公式最终细菌数 = 初始细菌数 * 2^天数差 计算最终的细菌数量。
分步作答
-
初始化和输入读取
读取n,表示测试数据组数。
定义每个月的天数列表:int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; -
处理每组测试数据
读取第一天和要求那一天的数据: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]; // 中间月份的天数 } }
-
-
计算细菌数量
利用天数差计算细菌数目:Long endN = (long) beginN; for (int i = 0; i < totalDays; i++) { endN *= 2; }
总结方法
通过以上步骤,可以高效地计算在指定日期的细菌数量。关键在于准确计算日期之间的天数差,然后利用指数增长公式计算细菌数量。这种方法的启发在于它能够解决类似的指数增长问题,例如金融中的复利计算和生物学中的细胞增长等。掌握日期计算和指数增长公式,可以应用于各种实际问题的解决。