三维打表
记录下每个年月日之前 ‘9’出现的总共次数
输出的时候将两个时间表相减
因为输出的要包括两个区间端点的日期
所以要处理一下初始日期
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int G[10000][14][32];//三维表
int main()
{
int cnt=0; //记录出现9的次数
memset(G,0,sizeof(G));
int a[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};//月份对应的日期
for(int i=2000; i<=9999; i++)
{
for(int j=1; j<=12; j++)
{
if(j==2)
{
if((i%4==0&&i%100!=0)||i%400==0)
{
for(int k=1; k<=29; k++)
{
if(i%10==9)
{
cnt++;
}
if(i/10%10==9)
{
cnt++;
}
if(i/100%10==9)
{
cnt++;
}
if(i/1000==9)
{
cnt++;
}
if(k%10==9)
{
cnt++;
}
G[i][j][k]=cnt;
}
}
else
{
for(int k=1; k<=28; k++)
{
if(i%10==9)
{
cnt++;
}
if(i/10%10==9)
{
cnt++;
}
if(i/100%10==9)
{
cnt++;
}
if(i/1000==9)
{
cnt++;
}
if(k%10==9)
{
cnt++;
}
G[i][j][k]=cnt;
}
}
}
else
{
for(int k=1; k<=a[j]; k++)
{
if(i%10==9)
{
cnt++;
}
if(i/10%10==9)
{
cnt++;
}
if(i/100%10==9)
{
cnt++;
}
if(i/1000==9)
{
cnt++;
}
if(j==9)
cnt++;
if(k%10==9)
{
cnt++;
}
G[i][j][k]=cnt;
}
}
}
}
int t;
scanf("%d",&t);
while(t--)
{
int y1,m1,d1,y2,m2,d2;
scanf("%d %d %d %d %d %d",&y1,&m1,&d1,&y2,&m2,&d2);
if(d1==1&&m1==1) //下面为处理初始日期
{
y1=y1-1;
m1=12;
d1=31;
}
else if(d1==1&&m1!=1)
{
m1=m1-1;
if((y1%4==0&&y1%100!=0)||y1%400==0)
a[2]=29;
d1=a[m1];
a[2]=28;
}
else
{
d1=d1-1;
}
printf("%d\n",G[y2][m2][d2]-G[y1][m1][d1]);
}
}