HJ73计算日期到天数转换
一.题目描述
根据输入的日期,计算是这一年的第几天。
二.算法一(模拟)
题目的意思很简单,我们要求出日期在当前年份的第几天,首先我们要知道月份有大小月之分,年份也有平年和闰年的区分,我们需要根据输入的数据去判断然后求和,下面是完整代码:
#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;
}
时间复杂度:,月份就从1到12是个常数,for循环为一个常数次数。
空间复杂度:,常数大小的数组来表示每一个月的天数。
三.算法二(优化)
前面的算法应该算比较简单了,但是还可以做进一步的优化,可以处理掉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;
}
时间复杂度:,直接计算常数的复杂度。
空间复杂度:,常数大小的数组来表示月数的天数的前缀和。