根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(n) O(n) ,空间复杂度:O(1) O(1)
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
#include <iostream>
using namespace std;
bool IsLeapYear(int year) // 闰年判断
{
if(((year%4 == 0 && 0 != year%100) || (0 == year%400)))
return true;
return false;
}
int GetDayofYear(int year, int month, int day)
{
int days = 0; // 用于返回结果
int DayOfMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
for(int i = 1; i < month; i++) // 将当前月份之前所有day加上
{
days += DayOfMonth[i];
if(i == 2 && IsLeapYear(year)) // 若是闰年 加一天
days+=1;
}
days += day;
return days;
}
int main()
{
int year, month, day;
while(cin>>year>>month>>day)
{
cout << GetDayofYear(year, month, day) <<endl;
}
return 0;
}
描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
示例1
输入:
20110412 20110422
输出:
11
#include <iostream>
using namespace std;
class Date
{
public:
bool Isleap(int year)
{
if((year%4==0 && year%100!=0) || year%400==0)
return true;
else
return false;
}
int Getday(int year, int month)
{
int arr[13] = {0, 31, 28, 31,30,31,30,31,31,30,31,30,31};
int day = arr[month];
if(Isleap(year) && month == 2)
day += 1;
return day;
}
Date(int year = 2022, int month = 12, int day = 8)
: _year(year)
, _month(month)
, _day(day)
{
if(!((year>0) && (month>0 && month<=12) && (day>0 && day<=Getday(year, month))))
{
cout<<"输入的日期不正确,即将将日期重新初始化为默认日期"<<endl;
_year = 2022;
_month = 12;
_day = 8;
}
}
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
// Date operator+(int day)
// {
// Date temp(*this);
// temp._day += day;
// int GetDay = 0;
// while(temp._day > (GetDay = Getday(temp._year, temp._month)))
// {
// temp._day -= GetDay;
// temp._month += 1;
// if(temp._month == 13)
// {
// temp._month = 1;
// temp._year += 1;
// }
// }
// return temp;
// }
Date operator+(int day)
{
// 因为 + 不改变左右参数的值,所以可以使用一个临时变量来存储并返回所得的结果。
Date temp(*this);
temp._day += day;
// 当这个天数不合法时循环继续
int Daysofmonth = 0;
while (temp._day > (Daysofmonth = Getday(temp._year, temp._month)))
{
// _day 减去本月的天数
temp._day -= Daysofmonth;
// _month 后移一月
temp._month += 1;
// 对月数格式检测是否合法,如果到13月了 直接转入1月
if (temp._month == 13)
{
temp._month = 1;
temp._year += 1;
}
}
return temp;
}
bool operator>(Date d)
{
if(_year>d._year || (_year==d._year && _month>d._month) || (_year==d._year && _month==d._month && _day>d._day))
return true;
else
return false;
}
bool operator==(Date d)
{
return (_year==d._year && _month==d._month && _day==d._day);
}
bool operator!=(Date d)
{
return !(*this==d);
}
// int operator-(Date d)
// {
// Date maxdate(*this);
// Date mindate(d);
// if(mindate>maxdate)
// {
// maxdate = d;
// mindate = *this;
// }
// int count = 0;
// while(maxdate != mindate)
// {
// mindate = mindate + 1;
// count++;
// }
// return count;
// }
int operator-(const Date& d)
{
Date maxdate(*this);
Date mindate(d);
if (mindate > maxdate)
{
maxdate = d;
mindate = *this;
}
int count = 0;
while (mindate != maxdate)
{
count++;
mindate = mindate + 1;
}
return count;
}
private:
int _year;
int _month;
int _day;
};
int main() {
// char s1[8], s2[8];
// cin>>s1>>s2;
// char s1_year[4], s2_year[4];
// for(int i = 0; i < 4; ++i)
// {
// s1_year[i] = s1[i];
// s2_year[i] = s2[i];
// }
// char s1_month[2], s2_month[2];
// for(int i = 4; i < 6; ++i)
// {
// s1_month[i] = s1[i];
// s2_month[i] = s2[i];
// }
// char s1_day[2], s2_day[2];
// for(int i = 4; i < 6; ++i)
// {
// s1_day[i] = s1[i];
// s2_day[i] = s2[i];
// }
// Date d1(atoi(s1_year), atoi(s1_month), atoi(s1_day));
// Date d2(atoi(s2_year), atoi(s2_month), atoi(s2_day));
int time1,y1,m1,d1;
int time2,y2,m2,d2;
scanf("%d%d",&time1,&time2);
if(time1 > time2)
{
int temp = time1;
time1 = time2;
time2 = temp;
}
y1 = time1/10000;
m1 = time1%10000/100;
d1 = time1%100;
y2 = time2/10000;
m2 = time2%10000/100;
d2 = time2%100;
Date D1(y1, m1, d1);
Date D2(y2, m2, d2);
int day = D1 - D2;
cout<<day+1<<endl;
}
// 64 位输出请用 printf("%lld")
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
示例1
输入:
2000 3 2000 31 2000 40 2000 60 2000 61 2001 60
输出:
2000-01-03 2000-01-31 2000-02-09 2000-02-29 2000-03-01 2001-03-01
#include <iostream>
using namespace std;
#include <stdio.h>
bool Isleap(int year) 判断闰年
{
if((year%4==0 && year%100!=0) || year%400==0)
return true;
else
return false;
}
int getday(int year, int month) 获取该年该月天数
{
int arr[13] = {0, 31, 28, 31,30,31,30,31,31,30,31,30,31};
int day = arr[month];
if(month == 2 && Isleap(year))
return day+1;
else
return day;
}
int main() {
int _year, _day;
while (scanf("%d %d", &_year, &_day) != EOF) {
int month = 1;
int day = getday(_year, month); 用给出的_day每次减去当月
while(_day > day) 若_day小于day则就在该月
{ 否则就是在后面月份,更新_day 和 month
_day -= day;
month++;
day = getday(_year, month);
}
printf("%d-%02d-%02d\n", _year, month, _day);
}
return 0;
}
// 64 位输出请用 printf("%lld")
描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
示例1
输入:
1 2008 2 3 100
输出:
2008-05-13
#include <iostream>
using namespace std;
#include<stdio.h>
bool Isleapyear(int year)
{
if((year%4==0 && year%100!=0) || year%400==0)
return true;
return false;
}
int GetDay(int year, int month)
{
int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = arr[month];
if(Isleapyear(year) && month==2)
return day+1;
else
return day;
}
void Date(int _year, int _month, int _day, int day)
{
_day += day;
while(_day > GetDay(_year, _month))
{
_day-=GetDay(_year, _month);
_month+=1;
if(_month==13)
{
_year+=1;
_month=1;
}
}
printf("%d-%02d-%02d\n", _year,_month,_day);
}
int main() {
int n,_year,_month,_day,day;
cin>>n;
for(int i = 0; i < n; ++i)
{
cin>>_year>>_month>>_day>>day;
Date(_year,_month,_day,day);
}
}
// 64 位输出请用 printf("%lld")