鱼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 编辑

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

def num_daysOfmonth(year,month):
    l1=[1,3,5,7,8,10,12]
    if month in l1:
        return 31
    else:
        if month == 2:
            if is_leap_year(year):
                return 29
            else:
                return 28
        else:return 30

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

    total_days = 0
    #print curList,ruzhiList
    #当前日期和入职日期在同一年
    if curList[0] - ruzhiList[0] == 0:
        if curList[1] - ruzhiList[1] == 0:
            total_days = curList[2] - ruzhiList[2] + 1
        else:
            for month in range(ruzhiList[1], curList[1]):
                if month > curList[1]:
                    total_days += num_daysOfmonth(ruzhiList[0], month)
                else:total_days += num_daysOfmonth(ruzhiList[0], month) - ruzhiList[2] + 1
            total_days += curList[2]
        print "您好,今天是您入职第%d天"%total_days
        sys.exit(0)
    #入职第三年及以后
    if curList[0] - ruzhiList[0] > 1:
        for year in range(ruzhiList[0]+1,curList[0]):
                if is_leap_year(year):
                    total_days += 366
                else:total_days += 365
                print "test1:", total_days

    #入职=1年
    for month_ruzhi in range(ruzhiList[1], 13):
        if month_ruzhi > ruzhiList[1]:
            total_days += num_daysOfmonth(ruzhiList[0], month_ruzhi)
        else:
            total_days += num_daysOfmonth(ruzhiList[0], month_ruzhi) - ruzhiList[2] + 1
    print "test3:", total_days


    for month_curr in range(1, curList[1]+1):
        if month_curr == curList[1]:
            total_days += curList[2]
        else:
            total_days += num_daysOfmonth(curList[0], month_curr)
    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 编辑
def isRunnian(year):
    return (year%4==0 and year%100!=0) or year%400 == 0

daysOfPingnain = [31,28,31,30,31,30,31,31,30,31,30,31]
daysOfRunnian = [31,29,31,30,31,30,31,31,30,31,30,31]

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

print(getDay(2014,8,18,2014,8,19))
print(getDay(2014,8,11,2017,12,4))
 
             
##    >>> 
##    入职第2天!
##    入职第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 | 显示全部楼层
def fun(yy,mm,dd,YY,MM,DD):
    a = [31,28,31,30,31,30,31,31,30,31,30,31]
    l = [366 if y%4==0 or y%400==0 and y%100!=0 else 365 for y in range(2015,2017)]
    a[1] = 29 if YY%4==0 or YY%400==0 and YY%100!=0 else 28
    b = sum(l)+sum(a[:MM-1])+DD
    a[1] = 29 if YY%4==0 or YY%400==0 and YY%100!=0 else 28
    b = b+sum(a[mm-1:])-18
    return b

if __name__=="__main__":
    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 编辑
def leap(n):
    if (n % 4 == 0 and n % 100 != 0) or (n % 400 == 0):
        return 1
    else:
        return 0
print('时间格式:YYYY-MM-DD')
print('入职时间:2014-08-18')
Y = 2014
M = 8
D = 18
Date = input('请输入当前日期:\n')
Sum = 0
day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
lis_Date = Date.split('-')
Year = int(lis_Date[0])
Month = int(lis_Date[1])
Day = int(lis_Date[2])
Flag_Leap = []
for i in range(2014, Year + 1):
    Flag_Leap.append(leap(i))
for j in range(2015, Year):
    Sum = Sum + 365 + Flag_Leap[j - 2014]
if Month >2:
    Sum_T = sum(day[:Month - 1]) + Flag_Leap[-1] + Day
else:
    Sum_T = sum(day[: Month - 1]) + Day
Sum_E = sum(day[M:]) + day[M - 1] - D + 1
Sum = Sum + Sum_T + Sum_E
print('当前日期为:%s' % Date)
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 编辑
'''不想判断平年闰年 (¬︿̫̿¬☆)'''
now = input('老哥,今天是几几年几月几日哈?(输入格式:1970-10-25):').split('-')
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)]
day1 = (int(now[0]) - 2014)*365
day2 = 0
for i in range(1,int(now[1])):
    day2 += int(month[i][1])
day2 = day2 - 212
day3 = int(now[2]) - 18
day = day1 + day2 + day3
print('斯国一,你已经入职了%s天了呢!'%day)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好蠢

本帖最后由 萧丹夜 于 2018-5-18 11:48 编辑
Year,Month,Day = map(int,input('请输入年月日(以-间隔):').split('-'))
Run = [0,31,29,31,30,31,30,31,31,30,31,30,31]
Pin = [0,31,28,31,30,31,30,31,31,30,31,30,31]
PrYear,PrMonth,PrDay = 2014 , 8 , 18
count = 1
CurYear = Year
while True :
    if Year != PrYear and CurYear == Year:
        if Year % 400 == 0 or ( Year % 100 != 0 and Year % 4 == 0 ):
            for i in range(0,Month):
                count += Run[i]
            count += Day
        else :
            for i in range(0,Month):
                count += Pin[i]
            count += Day
        CurYear = Year - 1
        Month = 13
    if CurYear != PrYear :
        if CurYear % 400 == 0 or ( CurYear % 100 != 0 and CurYear % 4 == 0 ):
            for i in range(0,13):
                count += Run[i]
        else :
            for i in range(0,13):
                count += Pin[i]
        CurYear -= 1
    if CurYear == PrYear and Year != PrYear :
        for i in range(PrMonth + 1,Month):
            count += Pin[i]
        count += ( 31 - 18 )
        break
    
    if CurYear == PrYear or Year == PrYear :
        if Month == PrMonth :
            count += ( Day - PrDay )
        else:
            for i in range(PrMonth + 1,Month):
                count += Pin[i]
            count += ( 31 - 18 + Day )
        break
    
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 | 显示全部楼层
def leap_year(year):
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        return True
    else:
        return False


def lead_time(date):
    ref = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days = sum(ref[:date[1]]) + date[2]
    if leap_year(date[0]) and date[1] > 2:
        days += 1
    return days


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

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

for year in range(date_1[0], date_2[0]):
    if leap_year(year):
        days_2 += 366
    else:
        days_2 += 365

result = days_2 + lead_time(date_2) - days_1 + 1
print(result)
请输入入职时间(例1999/1/1):2014/8/18
请输入当前日期(例1999/1/1):2017/4/19
976
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 23:30:58 | 显示全部楼层
本帖最后由 panheng 于 2019-8-20 06:42 编辑
import re
def get_days(month,day):                                     #计算当年天数
    monthlist = [1,2,3,4,5,6,7,8,9,10,11,12]
    daylist = [31,28,31,30,31,30,31,31,30,31,30,31]
    days = 0
    for each in monthlist:
        if monthlist.index(each)+1 < month:
            days += daylist[monthlist.index(each)]
    days += day
    return days
def leap_day(year):                                          #计算闰年天数
    leap_days = 0
    for _ in range(2014,year):
        if (_ % 4 == 0 and _ % 100 != 0) or _ % 400 == 0:
            leap_days += 1
    return leap_days
if __name__ == '__main__':
    date = input("请输入日期:年月日")
    datelist = re.findall(r'\d+', date)
    year = int(datelist[0])
    month = int(datelist[1])
    day = int(datelist[2])
    result = (year - 2014)*365        #计算结算日期前整年天数
    result = result + get_days(month,day) - get_days(8,18) + leap_day(year) + 1 #加上本年天数,减去8月18日天数,在加上入职第一
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:   #加上本年闰年天数
        if month > 2:
            result += 1
    print("%s是小陆入职的第 %s 天"%(date,result))
修改了下,考虑到截至年份为闰年是否计算闰年天数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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