//2019-10-31
//日期计算
#include <iostream>
using namespace std;
typedef struct date{
int year;//年
int month;//月
int day;//日
}Date;
void main()
{
int Check_y();//检查年是否合法
int Check_m();//检查月是否合法
int Check_d();//检查日是否合法
Date Newtime(Date date,int days);//求新日期
Date date1;//旧
Date date2;//新
int days;
printf("请输入当前日期\n");
scanf("%d %d %d",&date1.year,&date1.month,&date1.day);
printf("请输入天数\n");
scanf("%d",&days);
date2=Newtime(date1,days);
printf("%d %d %d\n",date2.year,date2.day,date2.day);
}
int Check_y(Date date){
if(date.year<=1000||date.year>=9999)//不是四位整数
return 0;
else if(date.year%4==0&&date.year%100!=0||date.year%400==0)//是闰年
return 2;
else
return 1;//是非闰年
}
int Check_m(Date date){
if(date.month<1||date.month>12)
return 0;
else
return 1;
}
int Check_d(Date date){
if(date.month==1||date.month==3||date.month==5||date.month==7||date.month==8||date.month==10||date.month==12){
if(date.day>=1&&date.day<=31)
return 1;
else
return 0;
}else if(date.month!=2){
if(date.day>=1&&date.day<=30)
return 1;
else
return 0;
}else{
if(Check_y(date)==2){//是闰月29天
if(date.day>=1&&date.day<=28)
return 1;
else
return 0;
}else{
if(date.day>=1&&date.day<=29)//是平月28天
return 1;
else
return 0;
}
}
}
//高斯日记算法
Date Newtime(Date date,int days){
Date later;
int a[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int i=0;
if(Check_y(date)==2)//是闰年
a[2]=29;
else
a[2]=28;
for(i=0;i<days;i++){
date.day %= a[date.month];
date.day++;
if(date.day==1){//如果是该月的最后一天
date.month %= 12;
date.month++;
if(date.month==1){
date.year++;
}
}
}
later=date;
return later;
}