首页 > 其他分享 >C语言之计算某日是该年的第几天

C语言之计算某日是该年的第几天

时间:2024-03-21 11:30:40浏览次数:17  
标签:30 第几天 int 31 year C语言 某日 复杂度 day

目录

一 简介

二 代码实现

三 时空复杂度


一 简介
 

在C语言中,计算某日是该年的第几天通常涉及以下步骤:

  1. 判断输入的年份是否为闰年。
  2. 根据判断结果,确定当年二月的天数(28或29天)。
  3. 然后,根据月份从前几个月开始累计天数。

二 代码实现

以下是一个简单的C语言函数示例,它接收一个结构体(包含年、月、日)作为参数,并返回该日期是该年的第几天:

#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 day_of_the_year(struct Date date) {
    int days[2][12] = { 
        { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // 平年每个月的天数
        { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }  // 闰年每个月的天数
    };
    
    int sum = 0;
    for (int i = 0; i < date.month - 1; ++i)
        sum += days[is_leap_year(date.year)][i];

    // 加上当前月份的天数
    sum += date.day;

    return sum;
}

// 定义一个Date结构体
struct Date {
    int year;
    int month;
    int day;
};

int main() {
    struct Date today = { 2024, 3, 20 }; // 示例日期:2024年3月20日
    printf("The day of the year is: %d\n", day_of_the_year(today));

    return 0;
}

这个代码片段首先定义了一个判断闰年的函数 is_leap_year,然后定义了 day_of_the_year 函数来计算指定日期是一年中的第几天。结构体 Date 包含年、月和日信息。函数通过遍历到指定月份之前的天数并加上当前月份的天数来计算总天数。

注意:上述代码没有进行错误检查,例如确保日期的有效性(如月份数值范围是1-12,天数是合法的)。在实际编程中,应当添加适当的错误处理代码以确保程序健壮性。

三 时空复杂度

  1. 时间复杂度:
    • 函数 is_leap_year 的时间复杂度为 O(1),因为它仅包含一次条件判断和两次模运算。
    • 函数 day_of_the_year 中,主要的时间消耗在于 for 循环,循环次数等于输入日期的月份减一。因此,其时间复杂度为 O(month)。在实际应用中,月份最大值为 12,所以可以视为常数时间复杂度 O(1)。

总结:整个代码片段的时间复杂度为 O(1)。

  1. 空间复杂度:
    • 静态数组 days 的大小固定为 2x12=24 个整数,无论输入的日期如何变化,所占用的空间都是固定的。
    • 结构体 Date 在栈上分配,其大小也是固定的(3个整数)。

总结:整个代码片段的空间复杂度为 O(1)。

标签:30,第几天,int,31,year,C语言,某日,复杂度,day
From: https://blog.csdn.net/m0_61635718/article/details/136864814

相关文章

  • 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 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并......
  • C语言游戏实战(4):人生重开模拟器
     前言:人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏:人生重开模拟器(ytecn.com)1.实现一个简化版的人生重开模拟器(1)游戏开始的时候,设定初始属性:颜值,体质,智力,家境(2)开始游戏,随机生成性别和出生......
  • C语言练习
    1.输出方形。#include<stdio.h>intmain(){ charstar='*',space=''; inta,i,j; for(a=0;a<5;a++) { if(a==0||a==4) for(i=0;i<4;i++) putchar(star); else { putchar(star); for(j=0;j&......