中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
算法设计:
- 计算从2010年1月1日开始至指定日期共有多少天;
- 由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去
- 根据余数判断他是在“打鱼”还是在“晒网”;
代码如下:
package dayu;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
*
* @author
* 中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”
* 。
*
*/
public class D {
static int year, month, day;
static String date;
static int i, leap;
static int[] commonYear = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 平年每月的天数
static int[] leapYear = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 闰年每月的天数
static final int sumCommon = 365; // 平年天数
static final int sumLeap = 366; // 闰年天数
/*
* 检查输入的日期是否合法
*/
boolean checkDate(int year, int month, int day) {
if (year < 2010) { // 如果年份小于2010年
System.out.println("日期不合法");
return false;
}
if (month > 12 || month <= 0) { // 月份大于12或小于0
System.out.println("日期不合法");
return false;
}
if (day < 0 || day >31) {// 天数小于0天和天数大于31天
System.out.println("日期不合法");
return false;
}
return true;
}
// 判断是闰年还是平年
boolean isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { // 是闰年
return true;
}
return false;
}
// 计算从2010-01-01日起,至今的总天数
int countDays(String date) throws Exception {
/*
* // Java中的 split函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回;
* 方法介绍
(1)public String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串
(2)public String[] split(String regex,int limit) 根据匹配给定的正则表达式来拆分此字符串
*/
String[] date1 = date.split(",");
year = Integer.parseInt(date1[0]);// parseInt(String a)函数将字符数组转换成十进制输出
month = Integer.parseInt(date1[1]);
day = Integer.parseInt(date1[2]);
while (checkDate(year, month, day) == false)
return -1;
int days = 0; // 记录总天数
int startYear = 2010;
// 计算整年天数并相加
for (int i = startYear; i < year; i++) {
if (isLeapYear(i)) { // 如果是闰年
days += sumLeap; // 加上闰年的天数366
} else {
days += sumCommon; // 加上平年的天数365
}
}
boolean leap = isLeapYear(year); // 保存nowYear是否是闰年
// 计算剩余的天数
for (int i = 0; i < month; i++) {
if (leap) { // nowYear是闰年
days += leapYear[i];
} else {
days += commonYear[i];
}
}
days += day;
return days; // 返回总天数
}
public String result(String date) throws Exception {
// 获得总天数
int days = countDays(date);
// 如果是异常日期返回非法日期
if (-1 == days) {
return "非法日期";
}
int remainder = days % 5;
// 如果余数是1,2,3就返回打鱼,反之晒网
if (remainder == 1 || remainder == 2 || remainder == 3) {
return "打鱼";
} else {
return "晒网";
}
}
public static void main(String[] args) throws Exception {
D f = new D(); // 创建一个对象,用于结果判断
try {
FileInputStream in = new FileInputStream("in.txt");// 创建字节输入流
InputStreamReader isr = new InputStreamReader(in);// 将字节输入流转换成字符输入流
BufferedReader br = new BufferedReader(isr);// 将字符输入流对象进行包装
FileOutputStream out = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
String line = ""; // 保存读一行的数据
String result = ""; // 保存计算的结果即是打鱼还是晒网还是非法日期
// 循环读文件
while (null != (line = br.readLine())) {
result = f.result(line); // 将读出来的一行日期字符串进行结果判断
bw.write(result); // 写入到结果文件中
bw.newLine(); // 换行
}
bw.close();
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("操作成功,程序没有语法错误");
}
}
在in.txt中输入
运行结果为