//欲知日期星期几 = 参考日期 星期几 + (相隔天数 % 7)
//
//判断日期是否有效
//
//比较两个日期大小
//
//算出相隔天数
//
//算出星期几
#include <stdio.h>
//判断是否是有效的日期
int AssertAvailabilityDate(long lYear,long lMon,long lDay)
...{
if( 0>=lMon || 12<lMon )
return 0;
if( 0>=lDay || 31<lDay )
return 0;
if(2==lMon)
...{
//年份能直接被4整除但不能被100整除的或者能直接被400整除的就是闰年,反之为平年.
int iIsLeapYear=0;
if( (lYear%4==0 && lYear%100!=0) || (lYear%400==0) )
...{
iIsLeapYear=1;
}
if(iIsLeapYear)
...{
if(29<lDay)
...{
return 0;
}
}
else
...{
if(28<lDay)
...{
return 0;
}
}
}
else
...{
if( 4==lMon || 6==lMon || 9==lMon || 11==lMon )
...{
if(30<lDay)
...{
return 0;
}
}
}
return 1;
}
//比较两个日期大小
//1>2 返回 1
//1==2 返回 0
//1<2 返回 -1
int CompareTwoDate(long lYear1,long lMon1,long lDay1,long lYear2,long lMon2,long lDay2)
...{
if(lYear1>lYear2)
...{
return 1;
}
else if(lYear1==lYear2)
...{
if(lMon1>lMon2)
...{
return 1;
}
else if(lMon1==lMon2)
...{
if(lDay1>lDay2)
...{
return 1;
}
else if(lDay1==lDay2)
...{
return 0;
}
else
...{
return -1;
}
}
else
...{
return -1;
}
}
else //if(lYear1<lYear2)
...{
return -1;
}
}
//算出相隔多少天
long GetDiscrepancyDays(long lYear1,long lMon1,long lDay1,long lYear2,long lMon2,long lDay2)
...{
//2006-12-31
long lDiscrepancy = 0 ;
if(0<CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
lDiscrepancy++;
lDay2++;
if(lMon2==1 ||lMon2==3 ||lMon2==5 ||lMon2==7 ||lMon2==8 ||lMon2==10 ||lMon2==12)
...{
if(lDay2>31)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
else if(lMon2==2)
...{
if((lYear2%4==0 && lYear2%100!=0) ||(lYear2%400==0))
...{
if(lDay2>29)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
else
...{
if(lDay2>28)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
}
else
...{
if(lDay2>30)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
}
}
else if(0>CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
lDiscrepancy++;
lDay1++;
if(lMon1==1 ||lMon1==3 ||lMon1==5 ||lMon1==7 ||lMon1==8 ||lMon1==10 ||lMon1==12)
...{
if(lDay1>31)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
else if(lMon1==2)
...{
if((lYear1%4==0 && lYear1%100!=0) ||(lYear1%400==0))
...{
if(lDay1>29)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
else
...{
if(lDay1>28)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
}
else
...{
if(lDay1>30)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
}
}
else
...{
lDiscrepancy = 0 ;
}
return lDiscrepancy ;
}
//导出函数
//算出星期几
//参考日期
//2007.1.1 => 1
//2007.1.7 => 7
int GetWeek(long lYear,long lMon,long lDay)
...{
if(!AssertAvailabilityDate(lYear,lMon,lDay))
...{
//输入的日期无效 返回 -1
return -1;
}
long lDiscrepancy = 0 ;
if(0==CompareTwoDate(2007,1,1,lYear,lMon,lDay))
...{
return 1;
}
else if(0<CompareTwoDate(2007,1,1,lYear,lMon,lDay))
...{
lDiscrepancy=GetDiscrepancyDays(2007,1,7,lYear,lMon,lDay);
return 7-(lDiscrepancy%7);
}
else
...{
lDiscrepancy=GetDiscrepancyDays(2007,1,1,lYear,lMon,lDay);
return 1+(lDiscrepancy%7);
}
}
//给我一个日期,我告诉你它的坐标. 7*6
//2007-1
// 一 二 三 四 五 六 日
//1 1 2 3 4 5 6 7
//2 8 9 10 11 12 13 14
//3 15 16 17 18 19 20 21
//4 22 23 24 25 26 27 28
//5 29 30 31
//6
//判断是否是有效的日期
//算出 lYear年1月1日 是星期几
//算出 lYear年1月1日 的坐标
//导出函数
//算出 lYear年lMon月lDay日 是星期几
//算出 lYear年lMon月lDay日 的坐标
int GetCoordinate(long lYear,long lMon,long lDay,int *pReturnX,int *pReturnY)
...{
*pReturnX=0;
*pReturnY=0;
if(!AssertAvailabilityDate(lYear,lMon,lDay))
...{
return 0;
}
int iFristWeek=GetWeek(lYear,lMon,1);
if(1==lDay)
...{
*pReturnX=iFristWeek;
*pReturnY=1;
return 1;
}
int iCurWeek=GetWeek(lYear,lMon,lDay);
*pReturnX=iCurWeek;
long lDiscrepancy=GetDiscrepancyDays(lYear,lMon,lDay,lYear,lMon,1);
*pReturnY=1;
while(lDiscrepancy--)
...{
iFristWeek++;
if(iFristWeek>7)
...{
iFristWeek=1;
(*pReturnY)++;
}
}
return 1;
}
int main()
...{
int a,b,c,w,x,y;
scanf("%d%d%d",&a,&b,&c);
w=GetWeek(a,b,c);
GetCoordinate(a,b,c,&x,&y);
printf(" %d-%d-%d => %d ",a,b,c,w);
printf(" %d-%d-%d => (%d,%d) ",a,b,c,x,y);
return 0;
}
//
//判断日期是否有效
//
//比较两个日期大小
//
//算出相隔天数
//
//算出星期几
#include <stdio.h>
//判断是否是有效的日期
int AssertAvailabilityDate(long lYear,long lMon,long lDay)
...{
if( 0>=lMon || 12<lMon )
return 0;
if( 0>=lDay || 31<lDay )
return 0;
if(2==lMon)
...{
//年份能直接被4整除但不能被100整除的或者能直接被400整除的就是闰年,反之为平年.
int iIsLeapYear=0;
if( (lYear%4==0 && lYear%100!=0) || (lYear%400==0) )
...{
iIsLeapYear=1;
}
if(iIsLeapYear)
...{
if(29<lDay)
...{
return 0;
}
}
else
...{
if(28<lDay)
...{
return 0;
}
}
}
else
...{
if( 4==lMon || 6==lMon || 9==lMon || 11==lMon )
...{
if(30<lDay)
...{
return 0;
}
}
}
return 1;
}
//比较两个日期大小
//1>2 返回 1
//1==2 返回 0
//1<2 返回 -1
int CompareTwoDate(long lYear1,long lMon1,long lDay1,long lYear2,long lMon2,long lDay2)
...{
if(lYear1>lYear2)
...{
return 1;
}
else if(lYear1==lYear2)
...{
if(lMon1>lMon2)
...{
return 1;
}
else if(lMon1==lMon2)
...{
if(lDay1>lDay2)
...{
return 1;
}
else if(lDay1==lDay2)
...{
return 0;
}
else
...{
return -1;
}
}
else
...{
return -1;
}
}
else //if(lYear1<lYear2)
...{
return -1;
}
}
//算出相隔多少天
long GetDiscrepancyDays(long lYear1,long lMon1,long lDay1,long lYear2,long lMon2,long lDay2)
...{
//2006-12-31
long lDiscrepancy = 0 ;
if(0<CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
lDiscrepancy++;
lDay2++;
if(lMon2==1 ||lMon2==3 ||lMon2==5 ||lMon2==7 ||lMon2==8 ||lMon2==10 ||lMon2==12)
...{
if(lDay2>31)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
else if(lMon2==2)
...{
if((lYear2%4==0 && lYear2%100!=0) ||(lYear2%400==0))
...{
if(lDay2>29)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
else
...{
if(lDay2>28)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
}
else
...{
if(lDay2>30)
...{
lDay2=1;
lMon2++;
if(lMon2>12)
...{
lMon2=1;
lYear2++;
}
}
}
}
}
else if(0>CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
...{
lDiscrepancy++;
lDay1++;
if(lMon1==1 ||lMon1==3 ||lMon1==5 ||lMon1==7 ||lMon1==8 ||lMon1==10 ||lMon1==12)
...{
if(lDay1>31)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
else if(lMon1==2)
...{
if((lYear1%4==0 && lYear1%100!=0) ||(lYear1%400==0))
...{
if(lDay1>29)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
else
...{
if(lDay1>28)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
}
else
...{
if(lDay1>30)
...{
lDay1=1;
lMon1++;
if(lMon1>12)
...{
lMon1=1;
lYear1++;
}
}
}
}
}
else
...{
lDiscrepancy = 0 ;
}
return lDiscrepancy ;
}
//导出函数
//算出星期几
//参考日期
//2007.1.1 => 1
//2007.1.7 => 7
int GetWeek(long lYear,long lMon,long lDay)
...{
if(!AssertAvailabilityDate(lYear,lMon,lDay))
...{
//输入的日期无效 返回 -1
return -1;
}
long lDiscrepancy = 0 ;
if(0==CompareTwoDate(2007,1,1,lYear,lMon,lDay))
...{
return 1;
}
else if(0<CompareTwoDate(2007,1,1,lYear,lMon,lDay))
...{
lDiscrepancy=GetDiscrepancyDays(2007,1,7,lYear,lMon,lDay);
return 7-(lDiscrepancy%7);
}
else
...{
lDiscrepancy=GetDiscrepancyDays(2007,1,1,lYear,lMon,lDay);
return 1+(lDiscrepancy%7);
}
}
//给我一个日期,我告诉你它的坐标. 7*6
//2007-1
// 一 二 三 四 五 六 日
//1 1 2 3 4 5 6 7
//2 8 9 10 11 12 13 14
//3 15 16 17 18 19 20 21
//4 22 23 24 25 26 27 28
//5 29 30 31
//6
//判断是否是有效的日期
//算出 lYear年1月1日 是星期几
//算出 lYear年1月1日 的坐标
//导出函数
//算出 lYear年lMon月lDay日 是星期几
//算出 lYear年lMon月lDay日 的坐标
int GetCoordinate(long lYear,long lMon,long lDay,int *pReturnX,int *pReturnY)
...{
*pReturnX=0;
*pReturnY=0;
if(!AssertAvailabilityDate(lYear,lMon,lDay))
...{
return 0;
}
int iFristWeek=GetWeek(lYear,lMon,1);
if(1==lDay)
...{
*pReturnX=iFristWeek;
*pReturnY=1;
return 1;
}
int iCurWeek=GetWeek(lYear,lMon,lDay);
*pReturnX=iCurWeek;
long lDiscrepancy=GetDiscrepancyDays(lYear,lMon,lDay,lYear,lMon,1);
*pReturnY=1;
while(lDiscrepancy--)
...{
iFristWeek++;
if(iFristWeek>7)
...{
iFristWeek=1;
(*pReturnY)++;
}
}
return 1;
}
int main()
...{
int a,b,c,w,x,y;
scanf("%d%d%d",&a,&b,&c);
w=GetWeek(a,b,c);
GetCoordinate(a,b,c,&x,&y);
printf(" %d-%d-%d => %d ",a,b,c,w);
printf(" %d-%d-%d => (%d,%d) ",a,b,c,x,y);
return 0;
}