HDU-1201-18岁生日

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1201

这个题目在比赛的时候提交了很多次,都是WA,主要错在,我没有考虑最后一年的,后一年,即y+18那一年如果是闰年并且月份m>=3||(m==2&&d==29)

那么天数要多加一天。

分三个部分  y   y+1->y+17   y+18

WA代码

#include<stdio.h>
int main(void)
{
int kk(int n);
int T;
int y,m,d;
int i,j;
int s;
scanf("%d",&T);
while(T--)
{
s=0;
scanf("%d-%d-%d",&y,&m,&d);
if(kk(y)&&m==2&&d==29)
{
if(kk(y+17)==0)
{
printf("-1 ");
continue;
}
}
if(kk(y))
{
if(m<=2&&d<=28)
s=s+366;
else
s=s+365;
}
else
s=s+365;
for(i=y+1;i<y+17;i++)
{
if(kk(i))
s=s+366;
else
s=s+365;
}
if(kk(y+17))
{
if(m>2)
s=s+366;
else if(m==2&&d==29)
s=s+366;
else
s=s+365;
}
else
s=s+365;
printf("%d ",s);
}
return 0;
}

int kk(int n)
{
if(n%4==0)
{
if(n%100==0)
{
if(n%400==0)
return 1;
else
return 0;
}
else
return 1;
}
else
return 0;
}

 AC代码

#include<stdio.h>
int main(void)
{
int kk(int n);
int T;
int y,m,d;
int i,j;
int s;
scanf("%d",&T);
while(T--)
{
s=0;
scanf("%d-%d-%d",&y,&m,&d);
if(kk(y)&&m==2&&d==29)
{
if(kk(y+17)==0)
{
printf("-1 ");
continue;
}
}
if(kk(y))
{
if(m<=2&&d<=28)
s=s+366;
else
s=s+365;
}
else
s=s+365;
for(i=y+1;i<=y+17;i++)
{
if(kk(i))
s=s+366;
else
s=s+365;
}
if(kk(y+18)&&(m>=3||(m==2&&d==29)))
s++;
printf("%d ",s);
}
return 0;
}

int kk(int n)
{
if(n%4==0)
{
if(n%100==0)
{
if(n%400==0)
return 1;
else
return 0;
}
else
return 1;
}
else
return 0;
}

AC代码

#include<stdio.h>
int main(void)
{
int run(int n);
int t,i;
int y,m,d;
scanf("%d",&t);
while(t--)
{
int s=0;
scanf("%d-%d-%d",&y,&m,&d);
if(run(y+18)==0&&m==2&&d==29)
{
printf("-1 ");
continue;
}
if(run(y)&&m<=2)
s++;
for(i=1;i<=17;i++)
{
if(run(y+i))
s++;
}
if(run(y+18)&&(m>2||(m==2&&d==29)))
s++;
printf("%d ",18*365+s);
}
return 0;
}

int run(int n)
{
if(n%400==0||(n%4==0&&n%100!=0))
return 1;
return 0;
}

程序之路漫漫无期,唯有坚持不懈,无畏艰难,才能攀登高峰。

原文地址:https://www.cnblogs.com/liudehao/p/3930631.html