1.闰年非闰年每个月份的天数:
int year[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
};
经观察发现:
a。2月闰年有29天,非闰年28天
b。1、3、5、7、8、10、12月份,每个月31天。
c。4,6,9,11月,每月30天
d。闰年一年有366天
e。不是闰年,一年有365天
2.闰年判断方法:
所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;
int judge(int y){if(y%400==0 || y%100!=0 && y%4==0){return 1;}return 0;
}
3.例子:
题目描述
蛤玮的妹子要过生日了,经过千挑万选,蛤玮决定给妹子买一盒水彩铅笔,然而卖多少个才合适呢.机智的蛤玮决定数一数今天是妹子出生的第多少天,然后就买那么多根铅笔.
给出蛤玮妹子的生日和今天的日期,求蛤玮一共需要买多少.
注意:生日当天算第0天.
输入
T(1<=T<=1000),表示数据组数.
每组数据一行y1,m1,d1,y2,m2,d2,其中y1,m1,d1表示妹子生日的年月日,y2,m2,d2表示蛤玮所在时空的当前天的年月日.
(1900<=y<=1000000, 1<=m<=12, 1<=d<=当月应有天数).输入保证当前天在妹子生日之后.
输出
每组数据输出一行,蛤玮要买多少根铅笔.
样例输入
2
1995 10 24 1995 10 25
1996 1 9 1996 3 7
样例输出
1
58
注意点:
1.由于数据大,容易超时,需要打表,先把x年到1900年的天数存到数组里
2.两个年份求之间的天数的方法
a。先转到同一年,y2年到1900年天数减去y1年到1900年天数,就是y1年到y2年的天数k
b。求y1年到从m1月到月底的x2;y2年从m2月到月底的天数x1
c。sum=k+x1+x2-365(或者366,根据y2年是否是闰年判断)sum几位两日期间的天数
如果后边年的月份(b)在前边年的月份(a)之后,那么从a月份到b月份的天数x=x2+x1-365
如果后边年的月份(b)在前边年的月份(a)之前,说明之前多加了一个365,最后减去就ok,说明仍然满足x=x2+x1-365
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int sum[1000010];
int init()
{for(int i=1900;i<=1000000;i++){if(i%4==0&&i%100!=0||i%400==0)sum[i]=sum[i-1]+366;elsesum[i]+=sum[i-1]+365;}
}
int main()
{init();int t,y,m,d,y1,m1,d1,k,i;scanf("%d",&t);while(t--){scanf("%d%d%d%d%d%d",&y,&m,&d,&y1,&m1,&d1);int s=0; // 1. 1到m.d天数 for(i=0;i<m;i++){if(y%4==0&&y%100!=0||y%400==0)s+=b[i];elses+=a[i];}s+=d;if(y%4==0&&y%100!=0||y%400==0) k=366-s;//k+m.d到y年年底的天数 elsek=365-s;k+=sum[y1]-sum[y];// y到y1年的天数 for(i=0;i<m1;i++){if(y1%4==0&&y1%100!=0||y1%400==0)k+=b[i];elsek+=a[i];}k+=d1;//k+1.1到m1.d1天数if(y1%4==0&&y1%100!=0||y1%400==0)k-=366;elsek-=365;printf("%d\n",k);}return 0;
}