[模拟]zoj 3326:An Awful Problem

大致题意:

    给出两个日期,求出两个日期中,月份为质数且日期为质数的日期有多少,包含两个端点日期。

 

大致思路:

    纯模拟,要注意考虑端点就为素数的情况。

 

#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;
}
 

你可能感兴趣的:(模拟,ACM,bbezxcy,zoj 3326)