数日子(SDUT 2558)
来源:互联网 发布:云豹直播源码搭建教程 编辑:程序博客网 时间:2024/06/09 15:11
数日子
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
按照公元纪年法,闰年被定义为能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年份除外,例如 1900 年就不是闰年。现在我们已知 2000 年 1 月 1 日为 星期六,你的任务是,对于给定的一个整数 n,写个程序计算并输出从 2000 年 1 月 1 日经过 n 天后的日期和该天是星期几。
Input
输入包含多组测试数据。
每组测试数据只包含一个正整数 n (0 <= n <= 99999)。
Output
对于每组测试数据,输出只有一行,为 n 天后的日期和该天为星期几,输出格式为 “YYYY-MM-DD week-day”(不包含引号) 具体格式见样例输出。
Example Input
100
400
Example Output
2000-04-10 Monday
2001-02-04 Sunday
Hint
“Monday”“Tuesday”“Wednesday”“Thursday”“Friday”“Saturday”“Sunday”
题目连接:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2558.html
题意很简单,就是要计算出从2000年1月1日 星期六 经过n天后的日期
一开始我一看n最大才99999就直接暴力了,结果超时了,想了一下觉得应该是因为有多组输入,而计算时间不是求一次的,而是多组数据所用的时间和,所以我就用数组存起来了每经过一天的日期
至于星期的计算方法,将天数对7取余就好
AC的代码
/*本代码的主要想法是循环所有的日期,如果日期合法则计数加一,直到要求的天数*/#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <string>#include <cstring>#include <algorithm>#include <vector>#include <stack>#include <queue>using namespace std;#define N 100000int yea[N];int mon[N];int da[N];int main(void){ int i,j,k; int year = 2000,month = 1,day = 1; i = 0; int n; for(year = 2000;; year++){ for(month = 1; month <= 12; month++){ for(day = 1; day <= 31; day++){ if(!((year%4==0 && year%100 != 0) || year%400 == 0)){ if(month == 2 && day == 29) continue; } if(month == 2){ if(day == 30 || day == 31) continue; } if(day == 31){ if(month == 2 || month == 4 || month == 6 || month == 9 || month == 11) continue; } yea[i] = year; mon[i] = month; da[i] = day; i++; if(i > 99999) break; } if(i > 99999) break; } if(i > 99999) break; } while(scanf("%d",&n) != EOF){ year = yea[n]; month = mon[n]; day = da[n]; if(month / 10 == 0 && day / 10 != 0) printf("%d-0%d-%d ", year, month, day); else if(day / 10 == 0 && month / 10 != 0) printf("%d-%d-0%d ", year, month, day); else if(month / 10 == 0 && day / 10 == 0) printf("%d-0%d-0%d ", year, month, day); else printf("%d-%d-%d ", year, month, day); switch(n%7){ case 0: printf("Saturday\n");break; case 1: printf("Sunday\n");break; case 2: printf("Monday\n");break; case 3: printf("Tuesday\n");break; case 4: printf("Wednesday\n");break; case 5: printf("Thursday\n");break; case 6: printf("Friday\n");break; } } return 0;}
另一种方法是按月计算,以月为单位处理数据
- 数日子(SDUT 2558)
- C语言实验——数日子 (sdut oj)
- SDUT-1182 C语言实验——数日子
- 数日子
- 数日子
- SDUT--枚举(删数问题)
- java数日子
- SDUT 组合数
- SDUT 数小区
- sdut oj1239 水仙花数
- sdut 删数问题
- 优越数 (sdut oj)
- 平方数 (sdut oj)
- 水仙花数 (sdut oj)
- SDUT-1239 水仙花数
- SDUT 1239 水仙花数
- 小学奥数(上)(SDUT 2866)
- [ACM] SDUT 2883 Hearthstone II (第二类Stiring数)
- 113
- 项目2
- DefaultHttpClient
- WORKFLOW 保存数据库报错:1602: Could not save.1400: Could not save to database. MODE=UPLOAD EFFDATE=2017/10/
- 什么是存储虚拟化?记录层和块层都包含哪些设备?
- 数日子(SDUT 2558)
- python-str()
- Hashmap与Hashtable的区别
- openstack多REGION配置(基于O版)
- shell getopts 用法
- MYSQL统计每年、每月、每日的数据
- 波士顿美联储高级副总裁:分布式账本可能“从根本上改变”金融业
- 索尼申请用户身份认证系统的区块链专利
- linux驱动编译进内核或模块配置