伪代码
先把所有符合条件的年月日找出 while (询问次数){ 输入询问串 for 遍历每一个找出的年月日 flag=1 for 遍历年月日的每一位 if (该位是否可以与询问串的相应位兼容) 不兼容flag=0 ans+=flag 输出ans }码子:
#include <iostream> using namespace std; const int N=1000000; int day[15]={0,31,28,31,30,31,30,31,31,30,31,30,31}; string s; int dprm[30],dcnt,dmprm[300],dmcnt; int prime[N],cnt,flag; bool st[50]; bool isprime(int x){ for(int i=2;i<=x/i;i++){ if(x%i==0) return false ; } return true; } void mTable(){ for(int i=2;i<=41;i++){ if(!st[i]) dprm[dcnt++]=i; for(int j=0;dprm[j]<=31/i;j++){ st[dprm[j]*i]=true; if(i%dprm[j]==0) break; } } for(int i=1;i<=12;i++){ for(int j=0;dprm[j]<=day[i];j++){ if(isprime(dprm[j]+i*100)) dmprm[dmcnt++]=dprm[j]+i*100; } } for(int i=4;i<=9999;i+=4){ if((i%100||i%400==0)&&isprime(i*10000+229)) prime[cnt++]=i*10000+229; } for(int i=1;i<=9999;i++){ for(int j=0;j<dmcnt;j++){ if(isprime(i*10000+dmprm[j])) prime[cnt++]=i*10000+dmprm[j]; } } } int n,ans; int main(int argc, char** argv) { cin>>n; mTable(); while(n--){ ans=0; cin>>s; for(int i=0;i<cnt;i++){ int num=prime[i]; flag=1; for(int j=7;flag&&j>=0;j--){ if(s[j]!='-'&&s[j]-'0'!=num%10) flag=0; num/=10; } ans+=flag; } cout<<ans<<endl; } return 0; }