问题描述:
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
问题分析:
需要解决这个数学问题,我们首先考虑中间的年份是否出现闰年这种特殊情况,如果出现闰年,那么一年的年数就会变成366天,如果本年是闰年的话,必须考虑月份是否在2月之前,还是2月之后。如果2月之前的话,就不用考虑2月有29天的情况。如果在2月之后,就必须考虑2月的特殊天数29天。
算法分析
1.通过输入的日期来首先判断输入的日期是否合法,以进行下一步判断操作。如果输入的年份小于2010,或者年份大于2010,但月份大于13或小于1,日期大于31或小于1,系统自动报错。
2.判断是否含有闰年,判定条件为定义年份为y,当(y%4==0&&y%100!=0)时,为闰年,那一年的天数为366天。否则为平年,天数为365天。
3.计算距离2010年1月1日的时间,通过分别计算差的年的天数和本年的之前月的天数加上本月的天数得到总时间。
4.通过除5来得到余数,分别判断事件。小于等于3在打鱼,大于3在晒网。
流程图
源代码
import java.util.Scanner;
public class buyu {
public static int Days(int y, int m, int d) {
int day1 = 0;//之前每年的天数
for (int i = 2010; i < y; i++) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
day1 += 366;//闰年为365天
} else {
day1 += 365;//平年为365天
}
}
int day2 = 0;//本年每月的天数
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (y % 4 == 0 && y % 100 != 0) {//判断是不是闰月
month[1] = 29;
}
for (int i = 1; i < m; i++) {
day2 += month[i];
}
int sum = day1 + day2 + d;//总共的天数
return 0;
}
public static void main(String[] args) {
{
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份");
int y = scan.nextInt();
System.out.println("请输入月份");
int m = scan.nextInt();
System.out.println("请输入日期");
int d = scan.nextInt();
if (y<2010) {
System.out.println("输入年份错误");
if(m<1||m>12){
System.out.println("输入月份错误");}
if (!(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)) { //非闰年输入2月天数大于等于29,报错
if(m == 2){
if(d >= 29 || d<1){
System.out.println("输入日期错误");}
}
}
else if(d<1||d>31){
System.out.println("输入日期错误");}}
else{
int s = Days(y, m, d);
int i = s % 5;
if (i >= 1 && i <= 3) {
System.out.println("捕鱼");
} else {
System.out.println("晒网");
}
}
}
}
}
测试结果