年月日问题描述
解决思路
令日期不断加1天,直到和另一日期相等为止;当加1天后超过当月天数,则月份加1,天数置1;当月份超过12时,年份加1,月份置1。
为便于直接得到每个月的天数,设置数组month[2][13],其中一维0表示平年,1表示闰年。
注意:为加快速度,先将较小年份不断加1,直到和较大年份相差1为止,再进行后续操作。
代码
#include<stdio.h>
/*---判断是否为闰年---*/
int IsLeap(int year){
if((year % 4 == 0 && year % 100 != 0 ) || (year % 400 == 0))
return 1;
else return 0;
}
int main(){
int time1, time2;
const int month[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
int count;
while(scanf("%d %d", &time1, &time2) != EOF){
if(time1 > time2){
int t = time1;
time1 = time2;
time2 = t;
}
int y1, m1, d1;
int y2, m2, d2;
y1 = time1 / 10000; m1 = time1 % 10000 / 100; d1 = time1 % 100;
y2 = time2 / 10000; m2 = time2 % 10000 / 100; d2 = time2 % 100;
count = 1;
/*---加快年份计算速度---*/
while(y2 - y1 > 1){
if(IsLeap(y1)) count += 366;
else count += 365;
y1++;
}
while(y1 != y2 || m1 != m2 || d1 != d2){
d1++;
if(d1 == month[IsLeap(y1)][m1] + 1){ //满当月天数
m1++;
d1 = 1;
}
if(m1 == 13){ //满当年天数
y1++;
m1 = 1;
}
count++;
}
printf("%d\n", count);
}
return 0;
}
总结
其他不等差问题和多判断问题均可使用数组将相关记录存起来做成table,方便进行比较,汇编中也同样存在相关问题,注意多思考联想。
参考
[1] 《算法笔记》P91