牛客网比赛水题

链接:https://www.nowcoder.com/acm/contest/115/B
来源:牛客网

给出一个出生日期,比如:1999-09-09,
问:从出生那一天开始起,到今天2018-04-21为止(包括出生日期和今天),有多少天,年月日都不包含数字4?

输入描述:

第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包含一个字符串“yyyy-mm-dd”(1990<=yyyy<=2018)
题目保证测试数据的正确性

输出描述:

输出题意要求的天数

示例1

输入

1
1999-09-09

输出

5020
思路:注意特殊情况就可以了

代码:

#include<stdio.h>
#define ll long long
int s[15]={0,28,25,28,0,28,27,28,28,27,28,27,28};
char tm[15];
int check(int n)
{
  if(n%400==0||(n%4==0&&n%100!=0))
  return 1;
  return 0;
}
int main()
{
  int t;
  scanf("%d",&t);
  while(t--)
  {
    getchar();
    int n,y,r;
    int i,j;
    ll sum=0;
    ll sum1=0;
    scanf("%s",tm);
    n=(tm[0]-'0')*1000+(tm[1]-'0')*100+(tm[2]-'0')*10+tm[3]-'0';
    y=(tm[5]-'0')*10+tm[6]-'0';
    r=(tm[8]-'0')*10+tm[9]-'0';
    //printf("%d %d %d ",n,y,r);
    for(i=1;i<y;i++)
    sum1+=s[i];
    if(y!=4)
    for(i=1;i<=r;i++)
    if(i!=4&&i!=14&&i!=24)
    sum1++;
    if(r==4||r==14||r==24)//注意日数位4,14,24的特殊情况
    sum1++;
    //printf("%d ",sum1);
    if(n==2018)
    {
      sum=81-sum1+1;
    }
    else
    {
      sum+=81;
      for(i=n+1;i<2018;i++)
      {
        if(i!=1994&&i!=2004&&i!=2014)
        {
          if(check(i))
          sum+=303;
          else
          sum+=302;
          //printf("%d ",i);
        }
        //printf("%d ",sum);
      }
      if(n!=1994&&n!=2004&&n!=2014)
      {
        if(check(n)&&y<=2)
        sum+=303-sum1+1;
        else
        sum+=302-sum1+1;
      }
    }
    printf("%lld ",sum);
  }
  return 0;
}

原文地址:https://www.cnblogs.com/cglongge/p/8902800.html