神马也不说了,打表很强大 = =。。。 直接打表,不符合电子表显示的数都不要,每个数里存从000000到这个数中符合题意的数。 如果是第一天到第二天,分成两次求和即可。 #include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int ans; int num[300000]; int com(int x,int y,int z) { return x*10000+y*100+z; } int init() { int i,sum = 0; memset(num,0,sizeof(num)); for(i=0; i<=235959; i++) { if( i%100 >= 60 || i%10000 >= 6000 ) num[i] = -1; if( num[i] == 0 ) if( i % 3 == 0 ) { sum++; num[i] = sum; } else num[i] = sum; } } int process(int s1,int s2,int s3,int e1,int e2,int e3) { int ans = 0,i; int num1 = com(s1,s2,s3); int num2 = com(e1,e2,e3); ans = num[num2] - num[num1]; if( num1 % 3 == 0 ) ans++; return ans; } int main() { int ncases; char str[20]; int s1,s2,s3,e1,e2,e3,len,ans,i,num1,num2; init(); scanf("%d",&ncases); while( ncases-- ) { scanf("%s",str); len = strlen(str); for(i=0; i<len; i++) if( str[i] == ':' ) str[i] = ' '; sscanf(str,"%d %d %d",&s1,&s2,&s3); scanf("%s",str); len = strlen(str); for(i=0; i<len; i++) if( str[i] == ':' ) str[i] = ' '; sscanf(str,"%d %d %d",&e1,&e2,&e3); num1 = com(s1,s2,s3); num2 = com(e1,e2,e3); if( num2 > num1 ) ans = process(s1,s2,s3,e1,e2,e3); else { ans = process(s1,s2,s3,23,59,59); ans += process(0,0,0,e1,e2,e3); } printf("%d/n",ans); } return 0; }