您的位置:首页 > 其它

ACM 第四题 (2010-6-7 15:43)

2012-07-13 21:54 176 查看
//过了很久又想起了这道题目,去年比完赛我就编了这道题目。时隔多月,我竟然自己都快要看不懂了。

//于是又编了一遍,测试数据和之前的一模一样,但是代码清晰不止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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: