1251
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,a年b月c日放置,定时为n天,请你计算它爆炸的准确日期。
输入
输入存在多组数据,每组数据输入一行,每一行输入四个正整数a,b,c,n
输入保证日期在1000-01-01到2020-01-01之间,且日期合法。
n不超过1000
输出
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。
样例输入 Copy
2015 1 1 15
2014 11 9 1000
样例输出 Copy
2015-01-16
2017-08-05
提示
题目已改编。
注意
- 理清头绪,用笔和纸去画一画
- 善于创建可复用的函数函数
- 闰年为:四年一闰,两百年不闰,四百年闰
算法
python v1.0:
- 按照月份处理
- 创建isLeap(),用于判断闰年
- 创建T(),通过参数,m、y确定当月天数
python v2.0、C++ v1.0:
- 模拟计时器,循环加一计时,时间复杂度O(n),取决于n
- C++ 中注意使用printf("%02d",d)来控制输出
能够说明的是:代码长些,速度快些qwq,第一种按每月每月的减,当n越来越大,两种算法速度都差不多
题解
python v1.0:
def isLeapYear(year):#四年一闰,两百年不闰,四百年闰 if (not year % 100 == 0) and (year % 4 == 0) or (year % 400 == 0): return True def T(m, y): is31Day = [1,3,5,7,8,10,12] if m in is31Day: return 31 elif m == 2: if isLeapYear(y): return 29 else: return 28 else: return 30 def main(data): y, m, d, n = map(int,data.split(' ')) acc = 0 acc = d + n while True: if T(m, y) == 31: if acc <= 31: d = acc break else: acc = acc - 31 if m == 12: y = y + 1 m = 1 else: m = m + 1 if T(m, y) == 30: if acc <= 30: d = acc break else: m = m + 1 acc = acc - 30 if T(m, y) == 29: if acc <= 29: d = acc break else: m = m + 1 acc = acc - 29 if T(m, y) == 28: if acc <= 28: d = acc break else: m = m + 1 acc = acc - 28 #print(acc) print('{:}-{:0>2}-{:0>2}'.format(y,m,d)) while True: main(input())
python v2.0:
def isLeapYear(year):#四年一闰,两百年不闰,四百年闰 if (not year % 100 == 0) and (year % 4 == 0) or (year % 400 == 0): return True else: return False def main(data): D = [31,28,31,30,31,30,31,31,30,31,30,31] y, m, d, n = map(int,data.split(' ')) if isLeapYear(y): D[1] = 29 for i in range(n): d = d + 1 if d > D[m-1]: d = 1 m = m + 1 if m > 12: m = 1 y = y + 1 if isLeapYear(y): D[1] = 29 else: D[1] = 28 print('{:}-{:0>2}-{:0>2}'.format(y,m,d)) while True: main(input())
c++ v1.0:
#include<iostream> using namespace std; int f(int x){ if(x%4==0&&x%100!=0||x%400==0) return 1; else return 0; } int d[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int main(){ int a,b,c,n; while(cin>>a>>b>>c>>n){ for(int i=1;i<=n;i++){ if(f(a)) d[1]=29; else d[1]=28; if(++c>d[b-1]) {c=1;b++;} if(b>12){ b=1; ++a; } } printf("%d-%02d-%02d\n",a,b,c); } return 0; } /************************************************************** Problem: 1251 User: yanshanbei Language: C++ Result: 正确 Time:0 ms Memory:2084 kb ****************************************************************/
来源:https://www.cnblogs.com/yanshanbei/p/12207739.html