//过了很久又想起了这道题目,去年比完赛我就编了这道题目。时隔多月,我竟然自己都快要看不懂了。
//于是又编了一遍,测试数据和之前的一模一样,但是代码清晰不止N+1倍。
//以前代码
#include<stdio.h>
int main()
{
int a[32];
int sum,y1,m1,d1,y2,m2,d2,i,j,k;
a[0]=0;a[1]=0;
for(i=2;i<32;i++)
a[i]=1;
for(i=2;i<32;i++)
for(j=2;j<32/i;j++)
a[i*j]=0;
while(scanf("%d%d%d",&y1,&m1,&d1)!=EOF)
{
scanf("%d%d%d",&y2,&m2,&d2);
sum=0;
if(y1!=y2)
{
for(i=y1;i<=y2;i++)
{
if(y2-i>=2)
{
if(i%400==0 || (i%4==0 && i%100!=0))
{sum+=127;continue;}
else
{sum+=126;continue;}
}
else if(y2-i==1)
{
for(j=m1;j<=12;j++)
{
if(j==m1)
{
if((i%400==0 || (i%4==0 && i%100!=0)) && j==2)
for(k=d1;k<=29;k++)
sum+=a[k];
else if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 ||j==12)
for(k=d1;k<=31;k++)
sum+=a[k];
else
for(k=d1;k<=30;k++)
sum+=a[k];
}
else
{
if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)
{sum+=11;continue;}
else if(j==2)
{
if(i%400==0 || (i%4==0 && i%100!=0))
sum+=10;
else
sum+=9;
}
else
sum+=10;
}
}
}
else
{
for(j=1;j<=m2;j++)
{
if(j==m2)
{
for(k=1;k<=d2;k++)
sum+=a[k];
}
else if(j==2)
{
if(i%400==0 || (i%4==0 && i%100!=0))
sum+=10;
else
sum+=9;
}
else if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10)
sum+=11;
else
sum+=10;
}
}
}
}
else
{
for(j=m1;j<=m2;j++)
{
if(m1==m2)
for(k=d1;k<=d2;k++)
sum+=a[k];
else
{
if(j==m1)
{
if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)
for(k=d1;k<=31;k++)
sum+=a[k];
else if(j==2)
{
if(i%400==0 || (i%4==0 && i%100!=0))
for(k=d1;k<=29;k++)
sum+=a[k];
else
for(k=d1;k<=28;k++)
sum+=a[k];
}
else
for(k=d1;k<=30;k++)
sum+=a[k];
}
else if(j!=m2)
{
if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)
for(k=1;k<=31;k++)
sum==a[k];
else if(j==2)
{
if(i%400==0 || (i%4==0 && i%100!=0))
for(k=1;k<=29;k++)
sum+=a[k];
else
for(k=1;k<=28;k++)
sum+=a[k];
}
else
for(k=1;k<=30;k++)
sum+=a[k];
}
else
{
for(k=1;k<=d2;k++)
sum+=a[k];
}
}
}
}
printf("%d\n",sum);
}
return 0;
}
//现在代码
#include<stdio.h>
int mode[32];
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
void start(){
int i,j;
for(i=0;i<32;i++)
mode[i]=1;
mode[0]=mode[1]=0;
for(i=2;i<32;i++){
for(j=2;j<32/i;j++)
mode[i*j]=0;
}
}
int main()
{
int yy1,mm1,dd1;//起始日期
int yy2,mm2,dd2;//结束日期
int m1,d1,m2,d2;//用来记录开始和结束月份/日期
int sum;//总糖数
int ysum;//年份的糖数
int msum;//月份的糖数
int dsum;//日 的糖数
start();
while(scanf("%d%d%d%d%d%d",&yy1,&mm1,&dd1,&yy2,&mm2,&dd2)!=EOF){
sum=ysum=msum=dsum=0;
int i,j,k;
//计算年
for(i=yy1;i<yy2;i++){
if(mm1>2){
if( ( (i+1 )%4==0 && ( i+1 ) %100!=0 ) || ( i+1 )%400==0 ){
ysum+=127;
}else{
ysum+=126;
}
}else{
if( ( i%4==0 && i %100!=0 ) || i%400==0 ){
ysum+=127;
}else{
ysum+=126;
}
}
}
//计算月
m1=min(mm1,mm2);
m2=max(mm1,mm2);
for(i=m1;i<m2;i++){
switch(i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:msum+=11;break;
case 4:
case 6:
case 9:
case 11:msum+=10;break;
case 2:if( yy2%400==0 || ( yy2%4==0 && yy2%100!=0 ) ) msum+=10; else msum+=9; break;
}
}
//计算日
d1=min(dd1,dd2);
d2=max(dd1,dd2);
for(i=dd1<=dd2?d1:d1+1;dd1<=dd2?i<=d2:i<d2;i++){//日的大小会有不同的处理,加的不同了
if(mode[i])
dsum++;
}
sum=ysum;
if(mm1>mm2)
sum-=msum;
else
sum+=msum;
if(dd1>dd2)
sum-=dsum;
else
sum+=dsum;
printf("sum=%d ysum=%d msum=%d dsum=%d\n",sum,ysum,msum,dsum);
}
return 0;
}
测试数据 :
输入:1001 03 20 2018 01 18
输出:128368