编程算法案例6
作者:championsky | 发布时间:
打鱼还是晒网
1.问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起便开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
2.问题分析
这道题目需要计算从1990年1月1日起某一天是“打鱼”还是“晒网”。我们可以通过计算天数差,将天数差除以5,看余数代表的是“打鱼”还是“晒网”。
3.算法设计
算法标题:打鱼还是晒网
3.1 输入
需要输入一个日期,表示要判断的某一天。
3.2过程
3.3 计算日期差
我们需要计算从1990年1月1日到某一天的天数差。
3.4确定是“打鱼”还是“晒网”
我们将天数差除以5,并取余。余数为0、1、2时,是“打鱼”,余数为3、4时是“晒网”。
3.5输出结果
根据余数的不同输出“打鱼”或者“晒网”。
3.6 输出
输出某人在输入的某一天中是“打鱼”还是“晒网”。
Python代码实现
import datetime
def fish_or_dry(date):
start_date = datetime.date(1990, 1, 1)
delta = (date - start_date).days
if delta % 5 < 3:
return "打鱼"
else:
return "晒网"
date = input("请输入日期,格式为YYYY-MM-DD:")
date = datetime.datetime.strptime(date, "%Y-%m-%d").date()
print(fish_or_dry(date))
JAVA代码实现
import java.text.*;
import java.util.*;
public class FishOrDry {
public static void main(String[] args) throws Exception {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Scanner in = new Scanner(System.in);
System.out.print("请输入日期,格式为yyyy-MM-dd:");
String dateString = in.nextLine();
Date date = dateFormat.parse(dateString);
Date startDate = dateFormat.parse("1990-01-01");
long delta = (date.getTime() - startDate.getTime()) / (1000L * 60 * 60 * 24);
if (delta % 5 < 3) {
System.out.println("打鱼");
} else {
System.out.println("晒网");
}
}
}
在Java中,计算日期差需要使用Date类的getTime()方法,计算两个日期之间的毫秒差。然后将毫秒差除以1000L * 60 * 60 * 24,就可以得到天数差。需要注意的是,计算的结果是long类型,因此需要将结果转化成long类型,这里使用了L来表示long类型。
假设输入的日期为:2021-08-05
运行结果如下所示:
请输入日期,格式为yyyy-MM-dd:2021-08-05
晒网
这表示在输入日期(2021-08-05)应当晒网,因为输入日期与1990-01-01相差的天数是11675,11675%5=0,因此是晒网的日子。
C代码实现
#include <stdio.h>
#include <time.h>
int main() {
char input_date[80];
struct tm input_tm = {0};
time_t input_time;
printf("请输入日期,格式为yyyy-MM-dd:");
scanf("%s", &input_date);
strptime(input_date, "%Y-%m-%d", &input_tm);
input_time = mktime(&input_tm);
// 计算与1990-01-01相差的天数
int days = (int)(input_time - 631123200) / (24 * 3600);
// 判断应当打鱼还是晒网
if (days % 5 <= 2) {
printf("打鱼");
} else {
printf("晒网");
}
return 0;
}
这个示例中,我们先通过strptime()函数将用户输入的字符串日期解析为tm结构体类型,并使用mktime()函数将tm结构体类型转换为time_t类型。然后我们计算输入的日期和1990-01-01相差的天数,并根据计算出的结果判断应当打鱼还是晒网。最后输出结果即可。
当输入2021-08-05时,运行结果如下所示:
请输入日期,格式为yyyy-MM-dd:2021-08-05
晒网
这表示在输入日期(2021-08-05)应当晒网,因为输入日期与1990-01-01相差的天数是11675,11675%5=0,因此是晒网的日子。
C++语言实现
#include <iostream>
#include <ctime>
using namespace std;
int main() {
string input_date;
struct tm input_tm = {0};
time_t input_time;
cout << "请输入日期,格式为yyyy-MM-dd:";
cin >> input_date;
strptime(input_date.c_str(), "%Y-%m-%d", &input_tm);
input_time = mktime(&input_tm);
// 计算与1990-01-01相差的天数
int days = (int)(input_time - 631123200) / (24 * 3600);
// 判断应当打鱼还是晒网
if (days % 5 <= 2) {
cout << "打鱼" << endl;
} else {
cout << "晒网" << endl;
}
return 0;
}
同样的,使用C++也需要包含<ctime>头文件,并使用strptime()和mktime()来进行字符串日期解析和日期计算。在上述代码中,我们使用了cin和cout来输入和输出。其余部分和C语言的实现是类似的。