QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

版主

Rank: 20Rank: 20Rank: 20Rank: 20

技术值
查看: 1164|回复: 37

[技术交流] Python:每日一题 24(答题领鱼币)

[复制链接]
最佳答案
318 
累计签到:394 天
连续签到:2 天
新手·ing 发表于 2017-4-9 15:17:54 116437 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
小陆每天要写一份工作日报,日报标准是“入职第X天-小陆”,对于“入职第几天”,小陆现在每次需要对上次写的日报标题里的天数+1。

请你写一段程序,帮小陆自动完成这件事。

提供写日期当天的年月日,算出已入职的天数(假定小陆的入职时间是 2014年8月18日)。


现在是2017年4月19日,问小陆上班几天了?

要求:不能使用时间,日期相关的库函数。



欢迎小伙伴们,一起答题!
如果你有能力,欢迎加入我们!
已经上车老司机:@冬雪雪冬 @gopythoner @lumber2388779 @ooxx7788
点我上车

本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
16 
累计签到:132 天
连续签到:1 天
朝闻夕死 发表于 2017-4-9 15:48:46 | 显示全部楼层
占个楼、凑个数、学个习、点个赞、支持下
最佳答案
318 
累计签到:394 天
连续签到:2 天
新手·ing  楼主| 发表于 2017-4-9 19:23:40 | 显示全部楼层
最佳答案
0 
累计签到:206 天
连续签到:1 天
六道土豆 发表于 2017-4-9 21:15:51 | 显示全部楼层
感觉一个好蠢的答案!希望不要见笑,没有考虑双休的情况!看看高手解答!
  1. month = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
  2. now_year = int(input('请输入现在何年:'))
  3. now_month = int(input('请输入现在何月:'))
  4. now_day = int(input('请输入现在何日:'))
  5. entry_year = int(input('请输入入职年份:'))
  6. entry_month = int(input('请输入入职月份:'))
  7. entry_day = int(input('请输入入职几号:'))
  8. leap_year = 0
  9. not_leap_year = 0
  10. a = 0
  11. for each_year in range(entry_year + 1, now_year):
  12.     if each_year % 400 == 0:
  13.         leap_year += 1
  14.     else:
  15.         not_leap_year += 1
  16. if entry_year % 400 == 0:
  17.     month[2] = 29
  18.     if entry_month > 1:
  19.         for i in range(1, entry_month):
  20.             a += month[i]
  21.         days_1 = 366 - a -entry_day
  22.         a = 0
  23.     else:
  24.         days_1 = 366 - entry_day      
  25. else:
  26.     if entry_month > 1:
  27.         for i in range(1, entry_month):
  28.             a += month[i]
  29.         days_1 = 365 - (a + entry_day)
  30.         a = 0
  31.     else:
  32.         days_1 = 365 - entry_day
  33. if now_year % 400 == 0:
  34.     month[2] = 29
  35.     if now_month > 1:
  36.         for i in range(1, now_month):
  37.             a += month[i]
  38.         days_2 = a + now_day
  39.         a = 0
  40.     else:
  41.         days_2 = now_day      
  42. else:
  43.     if entry_month > 1:
  44.         for i in range(1, now_month):
  45.             a += month[i]
  46.         days_2 = a + now_day
  47.         a = 0
  48.     else:
  49.         days_2 = now_day
  50. days = days_1 +days_2 + 366 * leap_year + 365 * not_leap_year
  51. print(days)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

最佳答案
0 
累计签到:23 天
连续签到:1 天
duanchaoman 发表于 2017-4-9 23:43:46 | 显示全部楼层
学习,支持,点赞
最佳答案
754 
累计签到:851 天
连续签到:20 天
冬雪雪冬 发表于 2017-4-10 00:00:47 | 显示全部楼层
先判断闰年,再计算是一年的第几天。
  1. def leapyear(year):
  2.     if (year % 4 == 0 and year % 100) or year % 400 == 0:
  3.         return True
  4.     else:
  5.         return False

  6. def days(ymd):
  7.     d =(0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30)
  8.     day = sum(d[:ymd[1]]) + ymd[2]
  9.     if leapyear(ymd[0]) and ymd[1] > 2:
  10.         day += 1
  11.     return day

  12. start = (2014, 8, 18)
  13. now = (2017, 4, 19)
  14. result = - days(start)
  15. for i in range(start[0], now[0]):
  16.     if leapyear(i):
  17.         result += 366
  18.     else:
  19.         result += 365
  20. result = result + days(now)
  21. print(result)
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
还是版主靠谱~  发表于 2017-4-10 17:42
最佳答案
0 
累计签到:163 天
连续签到:1 天
帅帅的平少 发表于 2017-4-10 10:44:55 | 显示全部楼层
学习、支持、点赞
最佳答案
154 
累计签到:28 天
连续签到:1 天
gopythoner 发表于 2017-4-10 14:17:51 | 显示全部楼层
这就好比做数学题,明明有三角函数公式可以用,你不准我用,让我去用加减乘除
这题哥哥不考了,交白卷

点评

不,我坚决不同意楼主的看法!: 5.0
不,我坚决不同意楼主的看法!: 5
  发表于 2017-4-10 17:41
最佳答案
318 
累计签到:394 天
连续签到:2 天
新手·ing  楼主| 发表于 2017-4-10 17:42:35 | 显示全部楼层
六道土豆 发表于 2017-4-9 21:15
感觉一个好蠢的答案!希望不要见笑,没有考虑双休的情况!看看高手解答!

我没做出来,厉害~
最佳答案
0 
累计签到:42 天
连续签到:1 天
rosen 发表于 2017-4-10 21:31:09 | 显示全部楼层
  1. #this file is used to calculate someone attend days
  2. #if someone's entry day is 2014.8.18
  3. #user input random days followed year.month.day format
  4. #the program calculated someone's attend days
  5. print('wonderful enjoy will start soon,please follow below tips accomplish!!')
  6. print('this version start day is 2014.8.18')
  7. print('please input end day')
  8. Y = input('please input years you think:')
  9. M = input('please input months you think:')
  10. D = input('please input days you think:')
  11. GAP_day = 0
  12. temp0_gap_day = 0
  13. temp1_gap_day = 0
  14. temp2_gap_day = 0
  15. leap_year = [31,29,31,30,31,30,31,31,30,31,30,31]
  16. nonleap_year = [31,28,31,30,31,30,31,31,30,31,30,31]
  17. if int(Y) < 2014 :
  18.     print('this is a invalid year number,should greater than 2014,please restart')
  19. elif int(Y) == 2014:
  20.     if int(M) == 8:
  21.         if int(D) >= 18 :
  22.             GAP_day = int(D) - 17
  23.         else:
  24.             print('warning:day number should greater than 18\nplease input day you think again:')
  25.     elif int(M) < 8:
  26.         print('warning:month number should greater than 8')
  27.     elif int(M) > 8 and int(M) <= 12 :
  28.         for i in range(7,int(M)-1):
  29.                   temp0_gap_day = temp0_gap_day + nonleap_year[i]
  30.     GAP_day = temp0_gap_day + int(D) - 17
  31.     print('小陆的入职时间是:%d天'%GAP_day)
  32. elif int(Y) > 2014:
  33.     for i in range(0,((int(Y)-2014))):
  34.         if (2014+i)%4 == 0 and (2014+i)%100 != 0 :
  35.                    #print('current year:%d'%(2014+i))
  36.                    #print('this year is a leap year!')
  37.                    temp1_gap_day += 366
  38.         else:
  39.                    #print('current year:%d'%(2014+i))
  40.                    #print('this year is a nonleap year!')
  41.                    temp1_gap_day += 365
  42.     #print('first part gap_day is:%d'%temp1_gap_day)
  43.     if int(Y)%4 == 0 and int(Y)%100 != 0 :
  44.                    #print('current year:%d'%int(Y))
  45.                    #print('this year is a leap year!')
  46.                    for i in range(0,int(M)-1):
  47.                        temp2_gap_day = temp2_gap_day + leap_year[i] + int(D)
  48.                   
  49.     else:
  50.                    #print('current year:%d'%int(Y))
  51.                    #print('this year is a nonleap year!')
  52.                    for i in range(0,int(M)-1):
  53.                        temp2_gap_day = temp2_gap_day + nonleap_year[i] + int(D)
  54.     #print('second part gap_day is:%d'%temp2_gap_day)
  55.     GAP_day = temp1_gap_day + temp2_gap_day - 230
  56.     print('小陆的入职时间是:%d天'%GAP_day)
  57.                   
  58.    
复制代码


比较繁琐的做法!!

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

最佳答案
0 
累计签到:42 天
连续签到:1 天
rosen 发表于 2017-4-10 21:51:57 | 显示全部楼层
rosen 发表于 2017-4-10 21:31
比较繁琐的做法!!

犯了个错误,55句应该为GAP_day = temp1_gap_day + temp2_gap_day - 230 + int(D),
并把47句和53句后面的int(D)删掉。。。。
刚和楼上的对比发现结果不一样,菜鸟多包涵!!!
最佳答案
1 
累计签到:6 天
连续签到:1 天
余欲渔 发表于 2017-4-11 11:28:38 | 显示全部楼层
冬雪雪冬 发表于 2017-4-10 00:00
先判断闰年,再计算是一年的第几天。

你这个有点问题哦,你把当前日期设置和入职日期同样的情况,看看是入职第几天
最佳答案
1 
累计签到:6 天
连续签到:1 天
余欲渔 发表于 2017-4-11 11:29:19 | 显示全部楼层
我是先算年,再是月,最后算日,分别加入入职天数
  1. rn,ry,rr=2014,8,18
  2. dn,dy,dr=2017,4,19
  3. day=0
  4. y=1 if dy-ry>0 else -1
  5. if ry>2:
  6.     for i in range(dn-rn):
  7.         day+=366 if (i+rn+1)%4==0 and (i+rn+1)%100!=0 else 365
  8. else:
  9.     for i in range(dn-rn):
  10.         day+= 366 if (i+rn)%4==0 and (i+rn)%100!=0 else 365
  11. for i in range(dy-ry if y>0 else ry-dy):
  12.     if (ry+i)%12 in [0,1,3,5,7,8,10]:
  13.         day+=31*y
  14.     elif (ry+i)%12 ==2:
  15.         day+=(29 if dn%4==0 and dn%100!=0 else 28)*y
  16.     else:day+=30*y
  17. day+=(dr-rr+1)
  18. print(day)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

最佳答案
754 
累计签到:851 天
连续签到:20 天
冬雪雪冬 发表于 2017-4-11 11:32:20 | 显示全部楼层
余欲渔 发表于 2017-4-11 11:28
你这个有点问题哦,你把当前日期设置和入职日期同样的情况,看看是入职第几天

说的有道理,我是计算的是两个日期的差值,按照题意应该再加一。
最佳答案
318 
累计签到:394 天
连续签到:2 天
新手·ing  楼主| 发表于 2017-4-11 15:49:45 | 显示全部楼层
冬雪雪冬 发表于 2017-4-11 11:32
说的有道理,我是计算的是两个日期的差值,按照题意应该再加一。

你竟然出错了
最佳答案
754 
累计签到:851 天
连续签到:20 天
冬雪雪冬 发表于 2017-4-11 15:58:30 | 显示全部楼层
最佳答案
0 
累计签到:18 天
连续签到:1 天
yjq随风 发表于 2017-4-13 13:46:52 | 显示全部楼层
朝闻夕死 发表于 2017-4-9 15:48
占个楼、凑个数、学个习、点个赞、支持下

这水有水平   我服你
最佳答案
5 
累计签到:406 天
连续签到:5 天
solomonxian 发表于 2017-6-7 18:58:42 | 显示全部楼层
为什么大家都不注释,看起来有些蛋疼···
  1. months = [31,28,31,30,31,30,31,31,30,31,30,31]
  2. start = [2016,2,28]
  3. now = [2020,3,1]

  4. # 判断两个日期是该年第几天,忽略闰年
  5. s_day = sum(months[:start[1]-1]) + start[2]
  6. n_day = sum(months[:now[1]-1]) + now[2]

  7. # 判断是否闰年的函数
  8. judge = lambda y: 1 if ((y%100 !=0 and y%4==0) or (y%400==0)) else 0

  9. # 第二年到去年之间的闰年有几个(如果有)
  10. leap_days = list(map(judge, range(start[0]+1,now[0])))

  11. # 判断第一年和今年,若是闰年根据日期决定如何处理2月29日,要避免在同一年重复计算
  12. s_day -= judge(start[0]) if s_day<=59 else 0
  13. n_day += judge(now[0]) if n_day>59 and now[0]!=start[0] else 0

  14. # 入职天数全部加起来(没有第0天,要+1)
  15. day_num = n_day - s_day+1 + (now[0]-start[0])*365 + sum(leap_days)
  16. print("入职第 %d 天,blah blah blah..." % day_num)
复制代码
最佳答案
0 

尚未签到

张大象 发表于 2017-9-18 11:25:19 | 显示全部楼层
def leap(year):
    if (year%4==0 and year%100==0) or year%400==0:
        return True
    else:
        return False
def days(day,now):
    d = [0,31,28,31,30,31,30,31,31,30,31,30]
    years = now[0]-day[0]
    ndays = sum(d[0:now[1]])+now[2]
    ddays = sum(d[0:day[1]])+day[2]
    if leap(now[0]) and now[1]>2:
        ydays = years*365+1
    else:
        ydays = years*365
    return ydays+ndays-ddays+1

if __name__ == '__main__':
    now1 = (2017,4,19)
    day1 = (2014,8,18)
    print('小陆入职第%d天了'%days(day1,now1))
   
最佳答案
0 
累计签到:18 天
连续签到:1 天
gausser 发表于 2017-9-21 20:12:32 | 显示全部楼层
  1. Month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

  2. # If leap year, then return True; Or return False
  3. def IsLeapYear(year):
  4.     if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)):
  5.         return True
  6.     else:
  7.         return False

  8. def DateToNumber(date):
  9.     year = date[0]
  10.     month = date[1]
  11.     day = date[2]
  12.     months = sum(i * Month[i - 1] for i in range(1, month))
  13.    
  14.     # Get the days of Month
  15.     if (True == IsLeapYear(year) and month > 1):
  16.         months =  months + 1
  17.     # Get the total days of the date
  18.     days = year * 365 + months + day

  19.     return days

  20. CurrentDate = [2014, 8, 18]
  21. EntryDate = [2014, 8, 18]

  22. print DateToNumber(CurrentDate) - DateToNumber(EntryDate)
复制代码

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2018-5-27 07:08

快速回复 返回顶部 返回列表