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 |
相关文章推荐
- 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖
- ACM第四专题—图算法总结
- ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
- hpu(acm)大赛第四题
- ACM_位运算总结
- 理工大学ACM平台题答案关于C语言 1017 A+B for Input-Output Practice
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
- ACM: uva 10827 -&…
- [ACM] POJ 2151 Check the difficulty of problems (概率+DP)
- 第四部分_函数式编程
- 2013福建ACM省赛10题题解
- 【AC大牛陈鸿的ACM总结贴】【ID AekdyCoin】人家当初也一样是菜鸟
- ACM: uva 1362 -&n…
- 2015 ACM/ICPC Asia Regional Hefei Online训练总结【5/10】
- HDU 4127 Flood-it!【2011 ACM Asia Fuzhou Regional Problem G】
- 理工大学ACM平台题答案关于C语言 1159 C语言实验——两个数比较
- p51 第二章 第四题 潘璠
- ACM--抛物线和直线围成的面积–-HDOJ 1071--The area--水
- 课程学习周记 第四+五周
- 搞ACM的你伤不起(转)