统计日期的天数,主要考虑闰年情况。
思路:
- 每一年的1、3、5、7、8、10、12月都是31天
- 每一年的4、6、9、11月都是30天
- 润年的2月有29天,其他年的2月都为28天
- 润年有2种情况:
- 能被4整除但不能被100整除(如2004年就是闰年,1800年不是)
- 能被400整除(如2000年是闰年)
题目1:输入一个日期,输出是当前年的第几天。
1 #include <iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 int isrun(int year) 6 { 7 if(((year%4==0)&&(year%100!=0))||year%400==0) return 1; 8 else return 0; 9 } 10 int daySum(int year,int month,int day) 11 { 12 int sum=0; 13 int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 14 if(!isrun(year)) months[2]=28; 15 else months[2]=29; 16 for(int i=1;i<=month-1;i++) 17 { 18 sum=sum+months[i]; 19 } 20 sum+=day; //year年的第几天 21 return sum; 22 } 23 int main() 24 { 25 int year,month,day; 26 scanf("%d %d %d",&year,&month,&day); 27 cout<<daySum(year,month,day)<<endl; 28 }
题目2:输入两个日期,输出这两个日期间隔的天数。
思路:
- 函数daySum(date): 输入为date的年月日,输出为date距离1年1月1日的天数。
- 计算出year年的第几天day(n)
- 统计1至year-1年的天数day(n-1),平年为365,闰年为366
- 总天数=day(n)+day(n-1)
- 日期A与B间隔天数,即daySum(A)-daySum(B)的绝对值。
1 #include <iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 int isrun(int year) 6 { 7 if(((year%4==0)&&(year%100!=0))||year%400==0) return 1; 8 else return 0; 9 } 10 int daySum(int year,int month,int day) 11 { 12 int sum=0; 13 int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 14 if(!isrun(year)) months[2]=28; 15 else months[2]=29; 16 for(int i=1;i<=month-1;i++) 17 { 18 sum=sum+months[i]; 19 } 20 sum+=day; //year年的第几天 21 sum+=(year-1)*365+year/4-year/100+year/400; //加上1到year-1的天数 22 return sum; 23 } 24 int abs(int num) //绝对值函数 25 { 26 if(num<0) return -num; 27 return num; 28 } 29 int main() 30 { 31 int year1,month1,day1,year2,month2,day2; 32 scanf("%d %d %d",&year1,&month1,&day1); 33 scanf("%d %d %d",&year2,&month2,&day2); 34 cout<<abs(daySum(year1,month1,day1)-daySum(year2,month2,day2))<<endl; 35 }