【乱搞】【AOJ-59】09年3月选拔赛第4题
Description
最近图书馆的工作人员在检查馆藏书目的时候发现,有很多书籍久久没有被借书人归还。于是工作人员决定给这些不负责任的借书人发信件通知他们来图书馆归还书籍并缴纳罚款(会有用吗?)。现在请你为图书馆工作人员编写程序,以计算每个不归还书籍的借书者借书天数。
Input
第一行输入为三个正整数y m d,分别代表现在的年、月、日;
第二行输入为一个正整数n,代表下面有多少个借书者信息;
下面有n行输入,每行有三个正整数yy mm dd, 代表一个借书者借书的日期(年、月、日)。
年份数据的范围为[1, 9999]
第二行输入为一个正整数n,代表下面有多少个借书者信息;
下面有n行输入,每行有三个正整数yy mm dd, 代表一个借书者借书的日期(年、月、日)。
年份数据的范围为[1, 9999]
Output
输出共有n行,每行输出一个正整数,代表对应的借书者借书天数。
Sample Input
1 1 1 3 1 1 1 1 1 31 1 2 28
Sample Output
0 30 58
思路:
1、如果是同一年,通过算出当前日期是此年的第几天,然后相减得出
2、如果不是同一年,则中间相隔y1-y2-1个完整的年,通过循环判断是否为闰年,如果是则+366天,否则+365天
结束循环后判断其实和结束年是否为闰年,然后加上366||365-起始年的第几天,再加上末尾年的第几天
PS:神经质般的用了__int64...
参考代码:
#include <stdio.h> #include <stdlib.h> __int64 wtd(int year,int month,int day);//求出是某年的第几天 int is_run(int year);//判断是否为闰年 int main() { int y,m,d; int yy,mm,dd; int n,i; __int64 day=0; scanf("%d%d%d",&y,&m,&d); scanf("%d",&n); while(n--) { scanf("%d%d%d",&yy,&mm,&dd); if(y==yy) { day=wtd(yy,mm,dd)-wtd(y,m,d); } else { for(i=1;i<yy-y;i++) { if(is_run(y+i)) day+=366; else day+=365; } if(is_run(y)) day+=366-wtd(y,m,d); else day+=365-wtd(y,m,d); day+=wtd(yy,mm,dd); } printf("%I64d ",day); day=0; } return 0; } __int64 wtd(int year,int month,int day) { int i; __int64 sum=0; if(is_run(year)) { for(i=1;i<month;i++) { if(i==2) sum+=29; else if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) sum+=31; else sum+=30; } sum+=day; } else { for(i=1;i<month;i++) { if(i==2) sum+=28; else if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) sum+=31; else sum+=30; } sum+=day; } return sum; } int is_run(int year) { if((year%4==0&&year%100!=0)||year%400==0) return 1; else return 0; }