鱼C论坛

 找回密码
 立即注册
楼主: 新手·ing

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

[复制链接]
发表于 2017-10-12 10:41:37 | 显示全部楼层
学以一波
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 17:40:40 | 显示全部楼层
本帖最后由 yang_zhong_well 于 2017-11-13 17:50 编辑

用的笨方法,验证过,没问题
  1. def is_leap_year(year):
  2.     if year%400 == 0 or (year%4 ==0 and year%100!=0):
  3.         return True
  4.     else:
  5.         return False

  6. def num_daysOfmonth(year,month):
  7.     l1=[1,3,5,7,8,10,12]
  8.     if month in l1:
  9.         return 31
  10.     else:
  11.         if month == 2:
  12.             if is_leap_year(year):
  13.                 return 29
  14.             else:
  15.                 return 28
  16.         else:return 30

  17. def days_ruzhi():
  18.     currentDate = raw_input("请输入今天的日期(eg:2017-11-13):")
  19.     ruzhiDate = '2014-8-18'
  20.     curList = currentDate.split('-')
  21.     ruzhiList = ruzhiDate.split('-')
  22.     curList = map(int,curList) #将一个list元素转变为整型
  23.     ruzhiList = map(int,ruzhiList)

  24.     total_days = 0
  25.     #print curList,ruzhiList
  26.     #当前日期和入职日期在同一年
  27.     if curList[0] - ruzhiList[0] == 0:
  28.         if curList[1] - ruzhiList[1] == 0:
  29.             total_days = curList[2] - ruzhiList[2] + 1
  30.         else:
  31.             for month in range(ruzhiList[1], curList[1]):
  32.                 if month > curList[1]:
  33.                     total_days += num_daysOfmonth(ruzhiList[0], month)
  34.                 else:total_days += num_daysOfmonth(ruzhiList[0], month) - ruzhiList[2] + 1
  35.             total_days += curList[2]
  36.         print "您好,今天是您入职第%d天"%total_days
  37.         sys.exit(0)
  38.     #入职第三年及以后
  39.     if curList[0] - ruzhiList[0] > 1:
  40.         for year in range(ruzhiList[0]+1,curList[0]):
  41.                 if is_leap_year(year):
  42.                     total_days += 366
  43.                 else:total_days += 365
  44.                 print "test1:", total_days

  45.     #入职=1年
  46.     for month_ruzhi in range(ruzhiList[1], 13):
  47.         if month_ruzhi > ruzhiList[1]:
  48.             total_days += num_daysOfmonth(ruzhiList[0], month_ruzhi)
  49.         else:
  50.             total_days += num_daysOfmonth(ruzhiList[0], month_ruzhi) - ruzhiList[2] + 1
  51.     print "test3:", total_days


  52.     for month_curr in range(1, curList[1]+1):
  53.         if month_curr == curList[1]:
  54.             total_days += curList[2]
  55.         else:
  56.             total_days += num_daysOfmonth(curList[0], month_curr)
  57.     print "您好,今天是您入职第%d天" % total_days
复制代码

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

使用道具 举报

发表于 2017-11-13 17:44:27 | 显示全部楼层
余欲渔 发表于 2017-4-11 11:29
我是先算年,再是月,最后算日,分别加入入职天数

你这个有点问题:当天2016-2-28,入职天数是560,你这个运行之后是558.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 10:13:45 | 显示全部楼层
本帖最后由 shigure_takimi 于 2017-12-4 10:18 编辑
  1. def isRunnian(year):
  2.     return (year%4==0 and year%100!=0) or year%400 == 0

  3. daysOfPingnain = [31,28,31,30,31,30,31,31,30,31,30,31]
  4. daysOfRunnian = [31,29,31,30,31,30,31,31,30,31,30,31]

  5. def getDay(year1, month1, date1, year2, month2, date2):
  6.     days1 = days2 = 0
  7.     if year2 < year1 or (year2 == year1 and month2 < month1) or (year2 == year1 and month2 == month1 and date2 < date1):
  8.         return '当前时间应不能早于入职时间!'
  9.     else:
  10.         days1 = sum(daysOfRunnian[:month1])+date1 if isRunnian(year1) else sum(daysOfPingnain[:month1])+date1
  11.         for year in range(year1, year2):
  12.             days2 += 366 if isRunnian(year) else 365
  13.         days2 += sum(daysOfRunnian[:month2])+date2 if isRunnian(year2) else sum(daysOfPingnain[:month2])+date2
  14.         return '入职第{}天!'.format(days2-days1+1)

  15. print(getDay(2014,8,18,2014,8,19))
  16. print(getDay(2014,8,11,2017,12,4))

  17.             
  18. ##    >>>
  19. ##    入职第2天!
  20. ##    入职第1212天!
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 20:09:15 | 显示全部楼层
def func(n):
    if (n % 400 == 0) or (n % 100 != 0 and n % 4 == 0):
        return True
    else:
        return False

def func1(i, k):
    count = 0
    for i in range(i+1, k+1):
        if func(i):
            count += 1
    return count

a = {'year':2014, 'month':8, 'day':18}
b = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

year = int(raw_input('Please enter a year: '))
month = int(raw_input('Please enter a month: '))
day = int(raw_input('Please enter a day: '))

if month == a['month'] and day == a['day']:
    c = func1(a['year'], year)
    total = 366 * c + 365 * (year - a['year'] - c)
    print total
elif month >= a['month']:
    if day >= a['day']:
        c = func1(a['year'], year)
        total = 366*c+365*(year-a['year']-c)+sum(b[a['month']:month+1])+day-a['day']
        print total
    else:
        c = func1(a['year'], year)
        total = 366*c+365*(year-a['year']-c)+sum(b[a['month']+1:month])+day+b[a['month']-1] - a['day']
        print total
elif month < a['month']:
    c = func1(a['year'], year-1)
    total = 366 * c + 365 * (year - a['year'] - c - 1) + sum(b[a['month']+1:]) +sum(b[:month]) + b[a['month']-1] - a['day'] + day
    print total
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 20:14:30 | 显示全部楼层
冬雪雪冬 发表于 2017-4-10 00:00
先判断闰年,再计算是一年的第几天。

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

使用道具 举报

发表于 2018-3-9 13:21:31 | 显示全部楼层
  1. def fun(yy,mm,dd,YY,MM,DD):
  2.     a = [31,28,31,30,31,30,31,31,30,31,30,31]
  3.     l = [366 if y%4==0 or y%400==0 and y%100!=0 else 365 for y in range(2015,2017)]
  4.     a[1] = 29 if YY%4==0 or YY%400==0 and YY%100!=0 else 28
  5.     b = sum(l)+sum(a[:MM-1])+DD
  6.     a[1] = 29 if YY%4==0 or YY%400==0 and YY%100!=0 else 28
  7.     b = b+sum(a[mm-1:])-18
  8.     return b

  9. if __name__=="__main__":
  10.     print(fun(2014,8,18,2017,4,19))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 14:53:43 | 显示全部楼层
我的结果是1006天,对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2018-3-10 22:00:37 | 显示全部楼层
moc 发表于 2018-3-10 14:53
我的结果是1006天,对吗?

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

使用道具 举报

发表于 2018-3-11 21:30:46 | 显示全部楼层
本帖最后由 victor.xu 于 2018-3-12 10:31 编辑
  1. def leap(n):
  2.     if (n % 4 == 0 and n % 100 != 0) or (n % 400 == 0):
  3.         return 1
  4.     else:
  5.         return 0
  6. print('时间格式:YYYY-MM-DD')
  7. print('入职时间:2014-08-18')
  8. Y = 2014
  9. M = 8
  10. D = 18
  11. Date = input('请输入当前日期:\n')
  12. Sum = 0
  13. day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  14. lis_Date = Date.split('-')
  15. Year = int(lis_Date[0])
  16. Month = int(lis_Date[1])
  17. Day = int(lis_Date[2])
  18. Flag_Leap = []
  19. for i in range(2014, Year + 1):
  20.     Flag_Leap.append(leap(i))
  21. for j in range(2015, Year):
  22.     Sum = Sum + 365 + Flag_Leap[j - 2014]
  23. if Month >2:
  24.     Sum_T = sum(day[:Month - 1]) + Flag_Leap[-1] + Day
  25. else:
  26.     Sum_T = sum(day[: Month - 1]) + Day
  27. Sum_E = sum(day[M:]) + day[M - 1] - D + 1
  28. Sum = Sum + Sum_T + Sum_E
  29. print('当前日期为:%s' % Date)
  30. print('入职第%d天-小陆' % Sum)
复制代码


我的结果是976天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-12 10:58:35 | 显示全部楼层

我算的是976天呢?包含了入职当天和当前2017-04-19这一天。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-30 11:06:46 | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-7 17:28:41 | 显示全部楼层
先把自己的笨办法贴上,然后来学习大佬的优秀方案~~另外有谁能教我一下怎么用代码模式发代码啊····
year = 2014
month = 8
day =18
def caculatedays(years,months,days):
    days1=[31,28,31,30,31,30,31,31,30,31,30,31]
    days2=[31,29,31,30,31,30,31,31,30,31,30,31]
    pastdays = 0
    for i in range(1000,years):
        if (i%4==0 and i%100!=0) or (i%100==0 and i%400==0):
            pastdays+=sum(days2)
        else:
            pastdays+=sum(days1)
    if (years%4==0 and years%100!=0) or (years%100==0 and years%400==0):
        for x in range(months-1):
            pastdays+=days2[x]
        pastdays+=days
    else:
        for x in range(months-1):
            pastdays+=days1[x]
        pastdays+=days
    return pastdays
dateTime = input('请输入当前的年月日,空格隔开').split()
for i in range(len(dateTime)):
    dateTime[i]=int(dateTime[i])
joindate = caculatedays(year,month,day)
workdate = caculatedays(dateTime[0],dateTime[1],dateTime[2])
print('入职第%d天-小陆'%(workdate-joindate))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-16 22:07:52 | 显示全部楼层
本帖最后由 小庆子 于 2018-5-16 22:10 编辑
  1. '''不想判断平年闰年 (¬︿&#811;&#831;¬☆)'''
  2. now = input('老哥,今天是几几年几月几日哈?(输入格式:1970-10-25):').split('-')
  3. 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)]
  4. day1 = (int(now[0]) - 2014)*365
  5. day2 = 0
  6. for i in range(1,int(now[1])):
  7.     day2 += int(month[i][1])
  8. day2 = day2 - 212
  9. day3 = int(now[2]) - 18
  10. day = day1 + day2 + day3
  11. print('斯国一,你已经入职了%s天了呢!'%day)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 11:10:23 | 显示全部楼层

好蠢

本帖最后由 萧丹夜 于 2018-5-18 11:48 编辑
  1. Year,Month,Day = map(int,input('请输入年月日(以-间隔):').split('-'))
  2. Run = [0,31,29,31,30,31,30,31,31,30,31,30,31]
  3. Pin = [0,31,28,31,30,31,30,31,31,30,31,30,31]
  4. PrYear,PrMonth,PrDay = 2014 , 8 , 18
  5. count = 1
  6. CurYear = Year
  7. while True :
  8.     if Year != PrYear and CurYear == Year:
  9.         if Year % 400 == 0 or ( Year % 100 != 0 and Year % 4 == 0 ):
  10.             for i in range(0,Month):
  11.                 count += Run[i]
  12.             count += Day
  13.         else :
  14.             for i in range(0,Month):
  15.                 count += Pin[i]
  16.             count += Day
  17.         CurYear = Year - 1
  18.         Month = 13
  19.     if CurYear != PrYear :
  20.         if CurYear % 400 == 0 or ( CurYear % 100 != 0 and CurYear % 4 == 0 ):
  21.             for i in range(0,13):
  22.                 count += Run[i]
  23.         else :
  24.             for i in range(0,13):
  25.                 count += Pin[i]
  26.         CurYear -= 1
  27.     if CurYear == PrYear and Year != PrYear :
  28.         for i in range(PrMonth + 1,Month):
  29.             count += Pin[i]
  30.         count += ( 31 - 18 )
  31.         break
  32.    
  33.     if CurYear == PrYear or Year == PrYear :
  34.         if Month == PrMonth :
  35.             count += ( Day - PrDay )
  36.         else:
  37.             for i in range(PrMonth + 1,Month):
  38.                 count += Pin[i]
  39.             count += ( 31 - 18 + Day )
  40.         break
  41.    
  42. print('入职第%d天-小陆'%count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-31 15:45:43 | 显示全部楼层
str_in=input("请输入入职日期,格式为yyyymmdd:")
str_out=input("请输入当天日期,格式为yyyymmdd:")
y=int(str_in[0:4])
m=int(str_in[4:6])
d=int(str_in[6:8])
y1=int(str_out[0:4])
m1=int(str_out[4:6])
d1=int(str_out[6:8])
lst=[0,31,28,31,30,31,30,31,31,30,31,30,31]
year=y
result=[]
for year in (range(y,y1+1)):
    if (year%4==0 and year%100!=0) or year%400==0:
        if year==y and m<=2:
            result.append(sum(lst[m:])+1-d)
        if year==y1 and m1>2:
            result.append(sum(lst[0:m1]+1+d1))
        else:
            result.append(366)
    else:
        if year==y:
            result.append(sum(lst[m:])-d)
        elif year==y1:
            result.append(sum(lst[0:m1])+d1)
        else:
            result.append(365)
print("今天是入职的第%d天" %(sum(result)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-25 22:35:15 | 显示全部楼层
import time
import datetime
strtime = time.strftime("%Y-%m-%d").split("-")
print(strtime)

access_protect = [2014,8,18]
sum_day = 0
month_day = [31,28,31,30,31,30,31,31,30,31,30,31]
if int(strtime[0]) - access_protect[0] > 0:
    count_year = (int(strtime[0])-access_protect[0]-1)*365 + sum([14,30,31,30,31])
    count_day = sum(month_day[:int(strtime[1])-1]) + int(strtime[2])
else:
    count_year = 0
    count_day = sum(month_day[access_protect[1]:int(strtime[1])]) + int(strtime[2]) -17

sum_day = count_year + count_day
print(sum_day)


date1 = datetime.datetime(2014,8,18)
date2 = datetime.datetime(2018,9,25)

daty_c = (date2-date1).days
print(daty_c)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-7 09:42:41 | 显示全部楼层
  1. def leap_year(year):
  2.     if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
  3.         return True
  4.     else:
  5.         return False


  6. def lead_time(date):
  7.     ref = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  8.     days = sum(ref[:date[1]]) + date[2]
  9.     if leap_year(date[0]) and date[1] > 2:
  10.         days += 1
  11.     return days


  12. # date_1:入职日期   date_2:当前日期
  13. date_1 = [int(x) for x in input("请输入入职时间(例1999/1/1):").split('/')]
  14. date_2 = [int(x) for x in input("请输入当前日期(例1999/1/1):").split('/')]

  15. # days_1:入职那年的第几天  days_2:当前日期到入职那年1月1日的时间差
  16. days_1 = lead_time(date_1)
  17. days_2 = 0

  18. for year in range(date_1[0], date_2[0]):
  19.     if leap_year(year):
  20.         days_2 += 366
  21.     else:
  22.         days_2 += 365

  23. result = days_2 + lead_time(date_2) - days_1 + 1
  24. print(result)
复制代码

  1. 请输入入职时间(例1999/1/1):2014/8/18
  2. 请输入当前日期(例1999/1/1):2017/4/19
  3. 976
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 23:30:58 | 显示全部楼层
本帖最后由 panheng 于 2019-8-20 06:42 编辑

  1. import re
  2. def get_days(month,day):                                     #计算当年天数
  3.     monthlist = [1,2,3,4,5,6,7,8,9,10,11,12]
  4.     daylist = [31,28,31,30,31,30,31,31,30,31,30,31]
  5.     days = 0
  6.     for each in monthlist:
  7.         if monthlist.index(each)+1 < month:
  8.             days += daylist[monthlist.index(each)]
  9.     days += day
  10.     return days
  11. def leap_day(year):                                          #计算闰年天数
  12.     leap_days = 0
  13.     for _ in range(2014,year):
  14.         if (_ % 4 == 0 and _ % 100 != 0) or _ % 400 == 0:
  15.             leap_days += 1
  16.     return leap_days
  17. if __name__ == '__main__':
  18.     date = input("请输入日期:年月日")
  19.     datelist = re.findall(r'\d+', date)
  20.     year = int(datelist[0])
  21.     month = int(datelist[1])
  22.     day = int(datelist[2])
  23.     result = (year - 2014)*365        #计算结算日期前整年天数
  24.     result = result + get_days(month,day) - get_days(8,18) + leap_day(year) + 1 #加上本年天数,减去8月18日天数,在加上入职第一
  25.     if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:   #加上本年闰年天数
  26.         if month > 2:
  27.             result += 1
  28.     print("%s是小陆入职的第 %s 天"%(date,result))
复制代码

修改了下,考虑到截至年份为闰年是否计算闰年天数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 22:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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