首页 > 其他分享 >C语言之打鱼晒网问题

C语言之打鱼晒网问题

时间:2024-03-21 11:31:09浏览次数:16  
标签:晒网 打鱼 int 天数 复杂度 C语言 start year input

目录

一 简介

二 代码实现

步骤一:判断输入日期

步骤二:计算总天数

步骤三:判断行为模式

三 时空复杂度


一 简介

打鱼晒网问题是一个经典的编程题目,源自中国的俗语“三天打鱼两天晒网”,意思是周期性地工作和休息。在C语言中实现这一问题的程序设计目标是:当给定一个日期后,计算出从某一固定起始日(如1990年1月1日或2011年1月1日)开始到该日期为止,渔夫按照每连续五天循环一次的行为模式(前三天打鱼,后两天晒网),确定在给定日期渔夫是在打鱼还是晒网。

二 代码实现

以下是解决此问题的基本步骤:

步骤一:判断输入日期

首先,需要获取用户输入的日期或者通过函数参数接收日期,并将其分解为年、月、日三个部分。

步骤二:计算总天数

编写一个函数来计算从固定起始日期到给定日期之间的总天数。这通常包括以下子步骤:

  • 判断输入年份是否为闰年。
  • 根据年份和平/闰年的不同,计算各年内每月的天数累计值。
  • 累加对应年份、月份以及日期的天数,得到总天数。

例如,可以使用类似于上述提及的方法计算自2011年1月1日以来的总天数,其中涉及到判断是否为闰年,以及根据不同的年份类型(平年或闰年)累加每个月的天数。

步骤三:判断行为模式

将计算出的总天数对5取余数,因为每5天是一个完整的循环周期:

  • 如果余数是1、2或3,则表示渔夫在这一天应该打鱼。
  • 如果余数是0或4,则表示渔夫在这一天应该晒网。

#include <stdio.h>

// 定义判断是否为闰年的函数
int is_leap_year(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        return 1;
    else
        return 0;
}

// 计算从指定年份开始到输入日期的总天数
int calculate_total_days(int start_year, int start_month, int start_day,
                        int input_year, int input_month, int input_day) {
    // 这里应该填充具体的计算逻辑,考虑闰年和平年的区别
    // ...
}

int main() {
    int start_year = 2011, start_month = 1, start_day = 1;
    int input_year, input_month, input_day;

    // 获取用户输入的日期
    // ...

    // 计算总天数
    int total_days = calculate_total_days(start_year, start_month, start_day,
                                         input_year, input_month, input_day);

    // 判断行为模式
    int remainder = total_days % 5;
    
    if (remainder == 1 || remainder == 2 || remainder == 3) {
        printf("渔夫在这一天打鱼。\n");
    } else if (remainder == 0 || remainder == 4) {
        printf("渔夫在这一天晒网。\n");
    }

    return 0;
}

请注意,以上代码示例仅展示了基本思路和结构,并未提供完整的calculate_total_days函数实现细节,实际编程时需要根据具体日期算法填充这部分内容。

三 时空复杂度

上述代码中未提供calculate_total_days函数的具体实现,因此无法精确分析整个算法的时间复杂度和空间复杂度。不过,我们可以大致推测:

  1. 时间复杂度:

    • is_leap_year函数的时间复杂度为O(1),因为它仅包含一次条件判断。
    • 对于calculate_total_days函数,其时间复杂度取决于具体实现。如果采用逐日累加的方式计算总天数,则最坏情况下(例如从公元元年到目标日期)时间复杂度为O(n),n表示经过的天数。但如果使用更高效的算法(如Zeller's congruence或直接查找预计算好的表),则可以降低至近乎O(1)。
  2. 空间复杂度:

    • 整个程序中没有使用额外的数据结构来存储大量数据,主要使用的变量都是局部变量,因此空间复杂度为O(1)。

在实际编程中,为了提高效率,我们通常会避免逐日累加计算天数,而是利用一些数学公式或者预计算好的日历表来快速定位输入日期与起始日期之间的天数差。这样的优化可以显著降低时间复杂度,提升程序性能。

标签:晒网,打鱼,int,天数,复杂度,C语言,start,year,input
From: https://blog.csdn.net/m0_61635718/article/details/136848747

相关文章

  • C语言之求任意次方的最后三位
    目录一简介二代码实现三时空复杂度一简介在C语言中,求一个整数任意次方的最后三位数可以使用快速幂算法结合取模运算来实现。二代码实现#include<stdio.h>//使用快速幂算法计算x的y次方对1000取模的结果intlastThreeDigits(intx,inty){int......
  • C语言之计算某日是该年的第几天
    目录一简介二代码实现三时空复杂度一简介 在C语言中,计算某日是该年的第几天通常涉及以下步骤:判断输入的年份是否为闰年。根据判断结果,确定当年二月的天数(28或29天)。然后,根据月份从前几个月开始累计天数。二代码实现以下是一个简单的C语言函数示例,它接收一......
  • c语言运用,猜数字小游戏设计
    我们要用c语言做一个猜数字小游戏,就是在1-100的数字中随机生成一个数字,然后我们去猜测那个生成的数字。做这个游戏,那我们需要的是一个整体的思想,做一个游戏需要有哪些部分?一开始可能会没有头绪,但是只要顺着一条线的思维,想一想要做的游戏刚开始是什么样子,玩的时候是什么样子,游......
  • c语言(自定义类型——结构体)
    C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增......
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二
     目录 ​编辑1.二叉树的顺序结构及实现1.1二叉树的顺序结构2堆的概念及结构3堆的实现3.1堆的代码定义3.2堆插入数据3.3打印堆数据3.4堆的数据的删除3.5获取根部数据3.6判断堆是否为空3.7堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序4.2升......
  • 每日一题:C语言经典例题之实数的小数部分
    题目描述输入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉。如输入111111.12345678912345678900则输出0.123456789123456789。若去掉末尾0之后小数部分为0,则输出“Nodecimalpart”。注意该实数的位数不超过100位。输入输入一个实数。输出输出该实数的小......
  • C语言的指针详解
    一、指针的定义及使用1.指针是什么?指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以......
  • C语言——复制字符串
    题目描述:有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。输入:数字n,一行字符串,数字m。输出:从m开始的子串。代码如下:代码一:#include<stdio.h>#include<stdlib.h>intmain(){intn,i=0,j,m;charc[20];......
  • 你真的了解c语言的10大字符串函数吗?
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言点击主页:optimistic_chen和专栏:c语言,创作不易,大佬们点赞鼓励下吧~前言:长度不受限制的字符串函数-strcpy,strcat,strcmp长度受限制的字符串函数-strncpy,strncat,strncmp文章目录前言:1.st......
  • 【leetcode】135_candy糖果题_贪心算法_C语言_唐完了之后是?(雾
    原题如下:(蓝字为原题链接,可跳转查看)135.分发糖果n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并......