64,195
社区成员
发帖
与我相关
我的任务
分享目录
计算日期这种题,一般都是计算日期之差来解决。比如计算两个日期之差,就分别计算他们到某一天(便于计算的日期)的差,再将两个差相减。

思路:读题可知最早日期为1971-1-1,这一天刚好为周五,那么只需要计算日期到1971-1-1的差然后模7即可计算出周几。
注意当前年份如果为闰年且月份大于二月,总的日期要多加一天。
int isleap(int n)
{
if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
{
return 1;
}
return 0;
}
char * dayOfTheWeek(int day, int month, int year){
char* ans[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sum = 0;
if(isleap(year) && month > 2)
{
sum += 1;
}
for(int i = 1971; i < year; i++)
{
if(isleap(i))
sum += 366;
else
sum += 365;
}
for(int i = 1; i < month; i++)
{
sum += mon[i];
}
sum += day;
return ans[(5 + sum - 1) % 7];
}

思路:只需要计算月和日,注意的是如果为闰年且月份大于二月,要多加一天。
int dayOfYear(char * date){
int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sum = 0, i, y, m, d;
sscanf(date, "%d-%d-%d", &y,&m,&d);
if(isleap(y) && m > 2)
{
sum += 1;
}
while(m > 1)
{
sum += mon[m-2];
m--;
}
sum += d;
return sum;
}
int isleap(int n)
{
if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
{
return 1;
}
return 0;
}

思路:计算两个日期到0000-0-0的差后做差即可。
int isleap(int n)
{
if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
{
return 1;
}
return 0;
}
int count(int y, int m, int d)
{
int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sum = 0;
if(isleap(y) && m > 2)
{
sum += 1;
}
while(m > 1)
{
sum += mon[m-2];
m--;
}
while(y)
{
y--;
if(isleap(y))
{
sum += 366;
}
else sum += 365;
}
sum += d;
return sum;
}
int daysBetweenDates(char * date1, char * date2){
int i, y1, y2, m1, m2, d1, d2, sum1 = 0, sum2 = 0;
sscanf(date1, "%d-%d-%d", &y1,&m1,&d1);
sscanf(date2, "%d-%d-%d", &y2,&m2,&d2);
sum1 = count(y1, m1, d1);
sum2 = count(y2, m2, d2);
return abs(sum1 - sum2);
}