《算法笔记》3.4小节——入门模拟->日期处理
A日期差值
不难,但是需要非常谨慎
刚开始的时候把想到的问题都列出来了,思路还是比较清晰的
这种情况下出错的几个地方:数组初始值对应平年闰年写反了,isrun传参数的时候,应该传入year手误传入了data
思考过程中认为
- 从A->B这里面计算A天,B当天不计算
- 在yearB-yearA>1的时候通过年来叠加,(初始调整固定A<B),到范围内再一个一个加,会更快
- 那么,假设A闰年B平年,从今年3.2->明年3.1是365,从今年2.28-明年2.27是366,(从这里可以发现从今年2.29-明年2.28是266,直接算容易懵)
- 因此我们发现,2.29及之前的是根据本年平润,而之后的是根据下一年
- 在遇到2.29时候,年份叠加判定,如果出现闰年变平年,因为我们实际计算的366天是今年2.29-明年2.28,B代表的是计算的下一天,我们需要修改为3.1
#include<stdio.h> using namespace std; int month[13][2]={0,0,31,31,28,29,31,31,30,30,31,31,30,30,31,31,31,31,30,30,31,31,30,30,31,31}; //平年为0,闰年为1 bool isrun(int year) { if((year%4==0 && year%100!=0)||(year%400==0)) return true; else return false; } int main() { int data1,data2; int year1,year2,month1,month2,day1,day2; while(scanf("%d",&data1)!=EOF && scanf("%d",&data2)!=EOF) { if(data2<data1) { int temp=data2; data2=data1; data1=temp; } year1=data1/10000; year2=data2/10000; data1=data1%10000; data2=data2%10000; month1=data1/100; month2=data2/100; day1=data1%100; day2=data2%100; int sum=1; //printf("%d %d ",data1,data2); while(year2-year1>1) { if(data1<=229) { // printf("%d is %d ",year1,isrun(year1)); if(isrun(year1)) { sum+=366; if(data1==229) { data1=301; month1=3; day1=1; //printf("haha%d ",sum); } } else sum+=365; } else { if(isrun(year1+1)) sum+=366; else sum+=365; } year1++; } data1=year1*10000+month1*100+day1; data2=year2*10000+month2*100+day2; while(year1<year2||month1<month2||day1<day2) { day1++; sum++; if(day1>month[month1][isrun(year1)]) { month1++; day1=1; if(month1>12) { month1=1; year1++; } } //printf("%d %d %d ",year1,month1,day1); } printf("%d ",sum); } return 0; }
之前想思路的图贴一下