HJ73计算日期到天数转换

一.题目描述

根据输入的日期,计算是这一年的第几天。 alt

二.算法一(模拟)

题目的意思很简单,我们要求出日期在当前年份的第几天,首先我们要知道月份有大小月之分,年份也有平年和闰年的区分,我们需要根据输入的数据去判断然后求和,下面是完整代码:

#include<bits/stdc++.h>
using namespace std;
//平年每一个月的天数
int data1[]={31,28,31,30,31,30,31,31,30,31,30,31};
//闰年每一个月的天数
int data2[]={31,29,31,30,31,30,31,31,30,31,30,31};
bool check(int x){
    //用来判断年是不是闰年
    if((x%400==0)||(x%4==0&&x%100!=0)){
        return true;
    }
    return false;
}
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    int sum=0;
    if(check(a)){
        //闰年使用数组data2
        for(int i=0;i<b-1;i++){
            sum+=data2[i];
        }
        sum+=c;
    } else {
        //平年使用数组data1
        for(int i=0;i<b-1;i++){
            sum+=data1[i];
        }
        sum+=c;
    }
    cout<<sum<<endl;
    return 0;
}

时间复杂度:O(1)O(1),月份就从1到12是个常数,for循环为一个常数次数。

空间复杂度:O(1)O(1),常数大小的数组来表示每一个月的天数。

三.算法二(优化)

前面的算法应该算比较简单了,但是还可以做进一步的优化,可以处理掉for循环,但是这个仅仅是看上去有点优化,可以用数组记录下月份天数的前缀和,对于2月份以后的数据进行判断其是不是闰年然后进行处理,下面是完整代码:

#include<bits/stdc++.h>
using namespace std;
//平年每一个月的天数的前缀和
bool check(int x){
    //用来判断年是不是闰年
    if((x%400==0)||(x%4==0&&x%100!=0)){
        return true;
    }
    return false;
}
int main(){
    int data[15]={31,59,90,120,151,181,212,243,273,304,334,365};
    int a,b,c;
    cin>>a>>b>>c;
    int sum=0;
    if(b<2){
        //在二月份前面的月份不需要考虑是不是闰年
        sum+=data[b-2];//是前面的天数同时数组下标从0开始 所以是减去2
        sum+=c;
    } else {
        sum+=data[b-2];
        if(check(a)&&c!=1){//特判一下 数据200 2 1 要判断是不是闰年2月第一天
            sum+=1;
        }
        sum+=c;
    }
    cout<<sum<<endl;
    return 0;
}

时间复杂度:O(1)O(1),直接计算常数的复杂度。

空间复杂度:O(1)O(1),常数大小的数组来表示月数的天数的前缀和。