大致题意:
给出两个日期,求出两个日期中,月份为质数且日期为质数的日期有多少,包含两个端点日期。
大致思路:
纯模拟,要注意考虑端点就为素数的情况。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int isleap(int i){ if(i%4!=0||(i%100==0&&i%400!=0)){ return 0; } else return 1; } int leap[13]={31,29,31,30,31,30,31,31,30,31,30,31}; int inleap[13]={31,28,31,30,31,30,31,31,30,31,30,31}; int sushu[20]={2,3,5,7,11,13,17,19,23,29,31}; bool isprim[40]; int getnum(int y,int m,int c){ int i,j,res=0; if(isleap(y)){ for(i=0;i<m-1;i++){ for(j=1;j<=leap[i];j++){ if(isprim[i+1]&&isprim[j]){ res++; } } } } else{ for(i=0;i<m-1;i++){ for(j=1;j<=inleap[i];j++){ if(isprim[i+1]&&isprim[j]){ res++; } } } } for(i=1;i<=c;i++){ if(isprim[m]&&isprim[i]){ res++; } } return res; } int main(){ int i,j,k,ans,b,c,y,m,d,cas,y1,m1,d1; memset(isprim,0,sizeof(isprim)); for(i=0;i<11;i++){ isprim[sushu[i]]=1; } cin>>cas; while(cas--){ ans=0; cin>>y>>m>>d; // cout<<getnum(y,m,d)<<endl; // continue; cin>>y1>>m1>>d1; if(y1!=y){ for(i=y+1;i<y1;i++){ if(isleap(i)){ ans+=53; } else{ ans+=52; } } if(isleap(y)){ b=53-getnum(y,m,d); } else{ b=52-getnum(y,m,d); } if(isprim[m]&&isprim[d]) { b++; } ans+=b; ans+=getnum(y1,m1,d1); } else{ b=getnum(y,m,d); if(isprim[m]&&isprim[d]){ b-=1; } ans=getnum(y1,m1,d1)-b; } cout<<ans<<endl; } return 0; }