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

//過了很久又想起了這道題目,去年比完賽我就編了這道題目。時隔多月,我竟然自己都快要看不懂了。

//於是又編了一遍,測試數據和之前的一模一樣,但是代碼清晰不止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

發佈了45 篇原創文章 · 獲贊 43 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章