年月日问题

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;
        else
            sum[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. 1m.d天数 
        for(i=0;i<m;i++)
        {
            if(y%4==0&&y%100!=0||y%400==0)
                s+=b[i];
            else
                s+=a[i];
        }
        s+=d;
        if(y%4==0&&y%100!=0||y%400==0) 
            k=366-s;//k+m.d到y年年底的天数 
        else
            k=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];
            else
                k+=a[i];
        }
        k+=d1;//k+1.1到m1.d1天数
        if(y1%4==0&&y1%100!=0||y1%400==0)
            k-=366;
        else
            k-=365;
        printf("%d\n",k);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/81137571