鱼C论坛

 找回密码
 立即注册
查看: 8206|回复: 52

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

[复制链接]
发表于 2017-4-9 15:17:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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

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

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


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

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



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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-9 15:48:46 | 显示全部楼层
占个楼、凑个数、学个习、点个赞、支持下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 19:23:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 21:15:51 | 显示全部楼层
感觉一个好蠢的答案!希望不要见笑,没有考虑双休的情况!看看高手解答!
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}
now_year = int(input('请输入现在何年:'))
now_month = int(input('请输入现在何月:'))
now_day = int(input('请输入现在何日:'))
entry_year = int(input('请输入入职年份:'))
entry_month = int(input('请输入入职月份:'))
entry_day = int(input('请输入入职几号:'))
leap_year = 0
not_leap_year = 0
a = 0
for each_year in range(entry_year + 1, now_year):
    if each_year % 400 == 0:
        leap_year += 1
    else:
        not_leap_year += 1
if entry_year % 400 == 0:
    month[2] = 29
    if entry_month > 1:
        for i in range(1, entry_month):
            a += month[i]
        days_1 = 366 - a -entry_day
        a = 0
    else:
        days_1 = 366 - entry_day       
else:
    if entry_month > 1:
        for i in range(1, entry_month):
            a += month[i]
        days_1 = 365 - (a + entry_day)
        a = 0
    else:
        days_1 = 365 - entry_day
if now_year % 400 == 0:
    month[2] = 29
    if now_month > 1:
        for i in range(1, now_month):
            a += month[i]
        days_2 = a + now_day
        a = 0
    else:
        days_2 = now_day       
else:
    if entry_month > 1:
        for i in range(1, now_month):
            a += month[i]
        days_2 = a + now_day
        a = 0
    else:
        days_2 = now_day
days = days_1 +days_2 + 366 * leap_year + 365 * not_leap_year
print(days)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 23:43:46 | 显示全部楼层
学习,支持,点赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 00:00:47 | 显示全部楼层
先判断闰年,再计算是一年的第几天。
def leapyear(year):
    if (year % 4 == 0 and year % 100) or year % 400 == 0:
        return True
    else:
        return False

def days(ymd):
    d =(0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30)
    day = sum(d[:ymd[1]]) + ymd[2]
    if leapyear(ymd[0]) and ymd[1] > 2:
        day += 1
    return day

start = (2014, 8, 18)
now = (2017, 4, 19)
result = - days(start)
for i in range(start[0], now[0]):
    if leapyear(i):
        result += 366
    else:
        result += 365
result = result + days(now)
print(result)

点评

我很赞同!: 5.0
我很赞同!: 5
还是版主靠谱~  发表于 2017-4-10 17:42
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-4-10 10:44:55 | 显示全部楼层
学习、支持、点赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 14:17:51 | 显示全部楼层
这就好比做数学题,明明有三角函数公式可以用,你不准我用,让我去用加减乘除
这题哥哥不考了,交白卷

点评

不,我坚决不同意楼主的看法!: 5.0
不,我坚决不同意楼主的看法!: 5
  发表于 2017-4-10 17:41
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-4-10 17:42:35 | 显示全部楼层
六道土豆 发表于 2017-4-9 21:15
感觉一个好蠢的答案!希望不要见笑,没有考虑双休的情况!看看高手解答!

我没做出来,厉害~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 21:31:09 | 显示全部楼层
#this file is used to calculate someone attend days
#if someone's entry day is 2014.8.18
#user input random days followed year.month.day format
#the program calculated someone's attend days
print('wonderful enjoy will start soon,please follow below tips accomplish!!')
print('this version start day is 2014.8.18')
print('please input end day')
Y = input('please input years you think:')
M = input('please input months you think:')
D = input('please input days you think:')
GAP_day = 0
temp0_gap_day = 0
temp1_gap_day = 0
temp2_gap_day = 0
leap_year = [31,29,31,30,31,30,31,31,30,31,30,31]
nonleap_year = [31,28,31,30,31,30,31,31,30,31,30,31]
if int(Y) < 2014 :
    print('this is a invalid year number,should greater than 2014,please restart')
elif int(Y) == 2014:
    if int(M) == 8:
        if int(D) >= 18 :
            GAP_day = int(D) - 17
        else:
            print('warning:day number should greater than 18\nplease input day you think again:')
    elif int(M) < 8:
        print('warning:month number should greater than 8')
    elif int(M) > 8 and int(M) <= 12 :
        for i in range(7,int(M)-1):
                  temp0_gap_day = temp0_gap_day + nonleap_year[i]
    GAP_day = temp0_gap_day + int(D) - 17
    print('小陆的入职时间是:%d天'%GAP_day)
elif int(Y) > 2014:
    for i in range(0,((int(Y)-2014))):
        if (2014+i)%4 == 0 and (2014+i)%100 != 0 :
                   #print('current year:%d'%(2014+i))
                   #print('this year is a leap year!')
                   temp1_gap_day += 366
        else:
                   #print('current year:%d'%(2014+i))
                   #print('this year is a nonleap year!')
                   temp1_gap_day += 365
    #print('first part gap_day is:%d'%temp1_gap_day)
    if int(Y)%4 == 0 and int(Y)%100 != 0 :
                   #print('current year:%d'%int(Y))
                   #print('this year is a leap year!')
                   for i in range(0,int(M)-1):
                       temp2_gap_day = temp2_gap_day + leap_year[i] + int(D)
                   
    else:
                   #print('current year:%d'%int(Y))
                   #print('this year is a nonleap year!')
                   for i in range(0,int(M)-1):
                       temp2_gap_day = temp2_gap_day + nonleap_year[i] + int(D)
    #print('second part gap_day is:%d'%temp2_gap_day)
    GAP_day = temp1_gap_day + temp2_gap_day - 230
    print('小陆的入职时间是:%d天'%GAP_day)
                   
    

比较繁琐的做法!!

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)删掉。。。。
刚和楼上的对比发现结果不一样,菜鸟多包涵!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 11:28:38 | 显示全部楼层
冬雪雪冬 发表于 2017-4-10 00:00
先判断闰年,再计算是一年的第几天。

你这个有点问题哦,你把当前日期设置和入职日期同样的情况,看看是入职第几天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 11:29:19 | 显示全部楼层
我是先算年,再是月,最后算日,分别加入入职天数
rn,ry,rr=2014,8,18
dn,dy,dr=2017,4,19
day=0
y=1 if dy-ry>0 else -1
if ry>2:
    for i in range(dn-rn):
        day+=366 if (i+rn+1)%4==0 and (i+rn+1)%100!=0 else 365
else:
    for i in range(dn-rn):
        day+= 366 if (i+rn)%4==0 and (i+rn)%100!=0 else 365
for i in range(dy-ry if y>0 else ry-dy):
    if (ry+i)%12 in [0,1,3,5,7,8,10]:
        day+=31*y
    elif (ry+i)%12 ==2:
        day+=(29 if dn%4==0 and dn%100!=0 else 28)*y
    else:day+=30*y
day+=(dr-rr+1)
print(day)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 11:32:20 | 显示全部楼层
余欲渔 发表于 2017-4-11 11:28
你这个有点问题哦,你把当前日期设置和入职日期同样的情况,看看是入职第几天

说的有道理,我是计算的是两个日期的差值,按照题意应该再加一。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-11 15:49:45 | 显示全部楼层
冬雪雪冬 发表于 2017-4-11 11:32
说的有道理,我是计算的是两个日期的差值,按照题意应该再加一。

你竟然出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-11 15:58:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 13:46:52 | 显示全部楼层
朝闻夕死 发表于 2017-4-9 15:48
占个楼、凑个数、学个习、点个赞、支持下

这水有水平   我服你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-7 18:58:42 | 显示全部楼层
为什么大家都不注释,看起来有些蛋疼···
months = [31,28,31,30,31,30,31,31,30,31,30,31]
start = [2016,2,28]
now = [2020,3,1]

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

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

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

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

# 入职天数全部加起来(没有第0天,要+1)
day_num = n_day - s_day+1 + (now[0]-start[0])*365 + sum(leap_days)
print("入职第 %d 天,blah blah blah..." % day_num)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-21 20:12:32 | 显示全部楼层
Month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

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

def DateToNumber(date):
    year = date[0]
    month = date[1]
    day = date[2]
    months = sum(i * Month[i - 1] for i in range(1, month))
    
    # Get the days of Month
    if (True == IsLeapYear(year) and month > 1):
        months =  months + 1
    # Get the total days of the date 
    days = year * 365 + months + day

    return days

CurrentDate = [2014, 8, 18]
EntryDate = [2014, 8, 18]

print DateToNumber(CurrentDate) - DateToNumber(EntryDate)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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