传送门:https://ac.nowcoder.com/acm/contest/115/B
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给出一个出生日期,比如:1999-09-09,
问:从出生那一天开始起,到今天2018-04-21为止(包括出生日期和今天),有多少天,年月日都不包含数字4?
输入描述:
第一行输入一个整数T(表示样例个数)
接下来T组样例
每个样例一行,包含一个字符串“yyyy-mm-dd”(1990<=yyyy<=2018)
题目保证测试数据的正确性
输出描述:
输出题意要求的天数
示例1
输入
1
1999-09-09
输出
5020
判断是否累加要每次循环开始就判断,否则会丢失第一天,第一天要另外判断
ac:
#include<bits/stdc++.h>
using namespace std;
int x[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int a,b,c;
int t;
scanf("%d",&t);
while(t--)
{
int cut=0;
scanf("%d-%d-%d",&a,&b,&c);
while(1)
{
if(a%10!=4&&b!=4&&c%10!=4)
cut++;
if(a==2018&&b==4&&c==21)
break;
if((a%4==0&&a%100!=0)||a%400==0)
x[2]=29;
else x[2]=28;
c++;
if(c>x[b])
{
c=1;
b++;
if(b>12)
{
b=1;
a++;
}
}
}
printf("%d\n",cut);
}
return 0;
}
我的习惯是放后面判断,对于这种题,容易少考虑条件
放后面判断:
#include<bits/stdc++.h>
using namespace std;
int x[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int a,b,c;
int t;
scanf("%d",&t);
while(t--)
{
int cut=1;
scanf("%d-%d-%d",&a,&b,&c);
if(a%10==4||b==4||c%10==4)
cut--;
while(1)
{
if(a==2018&&b==4&&c==21)
break;
if((a%4==0&&a%100!=0)||a%400==0)
x[2]=29;
else x[2]=28;
c++;
if(c>x[b])
{
c=1;
b++;
if(b>12)
{
b=1;
a++;
}
}
if(a%10!=4&&b!=4&&c%10!=4)
cut++;
}
printf("%d\n",cut);
}
return 0;
}