用Java解决:三天打鱼两天晒网问题
Welocome to Xiang’s world~
兄弟姐妹们!如果在翻看过程中发现错误,请纠正博主哦~
题目♥
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用java语言实现程序解决问题。
分析♥
① 计算从2010年1月1日开始至指定日期共有多少天;(公式:总天数=整年总天数+输入年之后天数)
② “打鱼”和“晒网”的周期5天,所以要将计算出的天数取余5;(小学知识哦~)
③ 再根据余数判断他是在“打鱼”还是在“晒网”;
若{余数为1,2,3,则他是在“打鱼”}
否则{在“晒网”}
敲黑板!注意事项♥
① 用户输入的年月日是否满足规范呢?
② 闰年怎么计算呢?
③ 用户输入的年份距离2010年1月1日有多少个闰年?
④ 用户输入的年份是否为闰年?用户输入当年月份是否含有满2月?有的话是29还是28呢?
代码♥
package fish1;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
/**
* Description: <br/>
* @author: xiang<br/>
* @date: 2021/3/21 22:25<br/>
* @param:[args]<br/>
* @return:void
*/
//输入年,月,日
Scanner scanner = new Scanner(System.in);
System.out.println("输入年:");
int year = scanner.nextInt();
System.out.println("输入月:");
int month = scanner.nextInt();
System.out.println("输入日:");
int day = scanner.nextInt();
if (validate(year, month, day)) {
System.out.println("校验成功");
judge(year, month, day);
} else {
System.out.println("校验失败");
}
}
public static boolean validate(int year, int month, int day) {
/**
* Description: <br/>
* @author: xaing<br/>
* @date: 2021/3/21 22:26<br/>
* @param:[year, month, day]<br/>
* @return:boolean
*/
//判断输入的年,月,日是否符合常理
if ((year > 2009) && (month > 0 && month < 13) && (day > 0 && day < 32)) {
//判断平月格式是否正确
if (month == 4 || month == 6 || month == 9 || month == 11) {
if (day > 30) {
return false;
}
} else if (month == 2) {
if(year%4==0 && year%100!=0 || year%400==0){
if(day>=30){
return false;
}
}else{
if(day>=29){
return false;
}
}
}
} else {
return false;
}
return true;
}
public static void judge(int year, int month, int day) {
/**
* Description: <br/>
* @author: xiang<br/>
* @date: 2021/3/21 22:26<br/>
* @param:[year, month, day]<br/>
* @return:void
*/
int x = year - 2010;//判断用户输入的年份与2010的年份差
int n = 0;//k为用户输入的年份与2010年之间闰年总数
int beforeTotal = 0;
//判断用户输入的年份与2010年之间有多少个闰年
for (int i = 0; i < x; i++) {
if (i%4==0 && i%100!=0 || i%400==0) {
n++;
}
}
beforeTotal = (365 * x + (n));
System.out.println(+year + "与2010年之间有" + n + "个闰年");
System.out.println(+year + "距离2010年有" + beforeTotal + "天");
//输入年后有多天
int afterTotal = 0;
//判断用户输入的月份有多少满月(31天)
int m = 0;//m为用户输入年份与用户输入年1月之间的满月数
int pingYueCount = 0;
switch (month) {
case 1:
break;
case 2:
m=1;
break;
case 3:
m = 1;
break;
case 4:
m=2;
break;
case 5:
m = 2;
break;
case 6:
m=3;
break;
case 7:
m = 3;
break;
case 8:
m = 4;
break;
case 9:
m=5;
break;
case 10:
m = 5;
break;
case 11:
m=6;
break;
case 12:
m = 6;
break;
}
System.out.println(+year + "有" + (m) + "个满月数");
//判断用户输入月份是否含有2月特殊月
if (month > 1) {
System.out.println("含有2月");
if(month==2){
pingYueCount = (month - m-1);
}else{
pingYueCount = (month - m - 1-1);
}
System.out.println("平月有:" + pingYueCount + "个");
} else {
System.out.println("不含有2月!");
System.out.println("没有平月");
}
//判断当年是否为闰年
if (year%4==0 && year%100!=0 || year%400==0) {
System.out.println("该年为闰年");
if(month>1){
afterTotal = m * 31 + pingYueCount * 30 + 29+day;
System.out.println("该年距离1月1日有:" + afterTotal + "天");
}else{
afterTotal = m * 31 + pingYueCount * 30 +day;
System.out.println("该年距离1月1日有:" + afterTotal + "天");
}
} else {
System.out.println("该年为平年");
if(month>1){
if (month==2){
afterTotal = 31+day;
}else{
afterTotal = m * 31 + pingYueCount * 30+28+day;
}
System.out.println("该年距离1月1日有:" + afterTotal + "天");
}else{
afterTotal = m * 31 + pingYueCount * 30+day;
System.out.println("该年距离1月1日有:" + afterTotal + "天");
}
}
int total = afterTotal + beforeTotal;
System.out.println("一共有:" + total + "天");
//打鱼晒网
if(total%5>0 && total%5<4){
System.out.println("该天为打渔");
}else{
System.out.println("该天为晒网");
}
}
}
测试♥
输入年格式不正确(月,日同理)
输入闰年2月日期不对
输入闰年试试~
那就浪漫情人节吧,吼吼~
总结♥
闰年的判断方式哦~:year%4==0 && year%100!=0 || year%400==0
这个算法题分了三部分:Main,validate,judge
附上流程图再整理一遍思路吧~
①主方法:
②校验
③judge: