Description
我们使用格式 YYYYMMDD 表示一个日期
显然,一个日期由 8 个 0 ~ 9 之间的数码组成
在这 8 个数码组成的数列中
如果有连续 3 个或以上的数码可以构成等差数列
等差数列(又名算术数列)是数列的一种。在等差数列中,任何相邻两项的差相等。该差值称为公差。例如数列 3, 5, 7, 9, 11, 13 就是一个等差数列。 在这个数列中,从第二项起,每项与其前一项之差都等于2,即公差为2。
Sigler, Laurence E. (trans.). Fibonacci's Liber Abaci.
Springer-Verlag. 2002: 259–260. ISBN 978-0-387-95419-6.
那么这个日期将无法成为密码
请你找出无法成为密码的日期有多少
Input
两行
第一行是开始日期
第二行是结束日期
日期使用格式 YYYYMMDD 表示,且均不在 1900 年 1 月 1 日之前,均不在 2999 年 12 月 31 日之后
保证结束日期不在开始日期之前
Output
一个数字
表示从开始日期到结束日期的日期范围(包括开始日期和结束日期)内,有多少个日期无法成为密码
Sample Input
19980327
19980806
Sample Output
3
Hint
暴力。
题解
// #define debug
#include "bits/stdc++.h"
using namespace std;
inline int query_days_for_year(int y)
{
return (y % 400 == 0|| (y % 4 == 0 && y % 100 != 0)) ? 366 : 365;
}
int mo[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int query_days_for_month(int m, int y)
{
//特别注意
if (m != 2)
return mo[m];
else
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
return 29;
else
return 28;
}
inline bool chk(char A[], char B[])//替代strcmp
{
for (int i = 0; i < 8; i++)
if (A[i] != B[i])
return 0;
return 1;
}
inline int tran(int y, int m, int d, char str[])
{
// #ifdef debug
// printf("y m d %d %d %d\n", y, m, d);
// #endif
if (d > query_days_for_month(m, y))
{
d = 1;
m++;
#ifdef debug
printf("m++\n");
#endif
if (m > 12)
{
m = 1;
y++;
#ifdef debug
printf("y++\n");
#endif
}
}
str[0] = y / 1000;
str[1] = y % 1000 / 100;
str[2] = y % 100 / 10;
str[3] = y % 10;
str[4] = m / 10;
str[5] = m % 10;
str[6] = d / 10;
str[7] = d % 10;
return y*10000 + m*100 + d;
}
int main()
{
int y1, m1, d1, y2, m2, d2;
char str1[9], str2[9];
scanf("%s%s", str1, str2);
for (int i = 0; i < 8; i++)
{
str1[i] -= '0';
str2[i] -= '0';
}
y2 = str2[0]*1000 + str2[1]*100 + str2[2]*10 + str2[3];
m2 = str2[4]*10 + str2[5];
d2 = str2[6]*10 + str2[7];
int sum = 0;
y1 = str1[0]*1000 + str1[1]*100 + str1[2]*10 + str1[3];
m1 = str1[4]*10 + str1[5];
d1 = str1[6]*10 + str1[7];
while (1)
{
for (int i = 0; i < 6; i++)
if (str1[i+1] - str1[i] == str1[i+2] - str1[i+1])
{
sum++;
break;
}
if (chk(str1, str2))
{
printf("%d\n", sum);
return 0;
}
//自增
d1++;
y1 = tran(y1, m1, d1, str1);
m1 = (y1 % 10000) / 100;
d1 = y1 % 100;
y1 /= 10000;
#ifdef debug
printf("p1 %d %d %d\n", y1, m1, d1);
#endif
}
return 0;
}