编程算法案例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()来进行字符串日期解析和日期计算。在上述代码中,我们使用了cincout来输入和输出。其余部分和C语言的实现是类似的。