鱼C论坛

 找回密码
 立即注册
查看: 5049|回复: 22

[技术交流] 小练习:20160530 20世纪有多少个星期日是当月的第一天?

[复制链接]
发表于 2016-5-30 10:00:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2016-6-6 11:00 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了81道题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题,并且你每做对一题,就可以下载到参考答案的pdf文件,看看你的实现方法与参考答案有什么不同,以利于迅速提高自己的水平。


                               
登录/注册后可看大图

好了言归正传,我们开始做小练习。




题目要求:
以python语言完成,如果是python2请注明。
程序以代码文字格式发帖。
题目比较简单,注重程序效率和创意。
答题在一周内完成,即6.6 10:00之前,其后将公开大家的答案,并评比成绩。

另程序和答案可以在网上搜到,希望大家独立完成。


题目:

以下是一些已知信息,但是或许你需要自己做一些其他的调查。

  • 1900 年 1 月 1 日是星期一。
  • 30 天的月份有:9 月,4 月,6 月,1 1月。
  • 此外的月份都是 31 天,当然 2 月除外。
  • 2 月在闰年有 29 天,其他时候有 28 天。
  • 年份可以被 4 整除的时候是闰年,但是不能 400 整除的世纪年(100 的整数倍年)除外。


20 世纪(1901 年 1 月 1 日到 2000 年 12 月 31 日)一共有多少个星期日落在了当月的第一天?


注意不能使用python的calendar等模块!!!

附加题:

n! = n × (n − 1) × ... × 3 × 2 × 1

例如, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800,

那么 10! 的各位之和就是 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

算出 100! 的各位之和。


奖励:
对所有完成程序并得出正确答案的将给予加分奖励,优秀的将额外加分。
在完成一批题目后,将根据每期的完成情况总评评出最佳,会有神秘大奖。



本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2016-5-30 10:07:30 | 显示全部楼层
本帖最后由 caobynk 于 2016-5-30 10:16 编辑
  1. # 小练习
  2. numDays1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  3. numDays2 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

  4. def isLeapYear(year):
  5.     if year%100 == 0 :
  6.         if year%400 == 0: return True
  7.         else: return False
  8.     else:
  9.         if year%4 == 0: return True
  10.         else: return False

  11. Num = 2
  12. SunMonth = 0
  13. for year in range(1901, 2001):
  14.     if isLeapYear(year):
  15.         numDays = numDays2
  16.     else:
  17.         numDays = numDays1
  18.     for month in range(1,13):
  19.         if Num%7 ==0: SunMonth += 1
  20.         Num += numDays[month-1]

  21. print('20世纪共有' + str(SunMonth) + '个星期日是当月第一天')

  22. # 附加题
  23. import math
  24. import functools
  25. result = math.factorial(100)
  26. print('100!的各位之和为:' + str(functools.reduce(lambda x,y:int(x)+int(y),list(str(result)))))
  27.         
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-30 11:46:27 | 显示全部楼层
本帖最后由 bacon6581 于 2016-5-30 16:06 编辑
  1. from time import time
  2. start=time()
  3. run_nian=set()
  4. for i in range(1901,2001):
  5.     if i%4==0 and i%100 != 0:
  6.         run_nian.add(i)

  7. xiao_yue=set([9,4,6,11])

  8. n=366 #1900-1-1为第一天,星期一,当年不为闰年;则1901-1-1为第366天
  9. result=0
  10. day=[]

  11. if n%7==0:#判断1901-1-1是否为星期天
  12.     result+=1
  13.     day.append('1901-1')
  14. for nian in range(1901,2001):
  15.     for yue in range(1,13):
  16.         if yue==2 and nian in run_nian:
  17.             n+=29
  18.         elif yue==2:
  19.             n+=28
  20.         elif yue in xiao_yue:
  21.             n+=30
  22.         else:
  23.             n+=31
  24.         if n%7==0:
  25.             result+=1
  26.             day.append(str(nian)+'-'+str(yue+1))
  27.             #如果出现'1900-13'即为下一年的第一个月('1901-1')
  28. if n%7==0:#判断2000-13是否为星期天,即2001-1-1
  29.     result-=1
  30.     day=day[:-1]

  31. print(day)
  32. print(result)
  33. print(time()-start)      

  34. string='''----------------------
  35.        附加题:
  36. ----------------------'''
  37. print(string)
  38. start=time()
  39. n=100
  40. num=1
  41. while n>1:
  42.     num*=n
  43.     n-=1

  44. value=0
  45. for i in str(num):
  46.     value+=int(i)
  47. print(value)
  48. print(time()-start)
复制代码

无标题.jpg

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-30 14:09:03 | 显示全部楼层
本帖最后由 holdme 于 2016-6-6 09:38 编辑
  1. import time
  2. from math import floor

  3. def day_of_week(year, month, day):

  4.     d = day
  5.     m = (month - 3) % 12 + 1
  6.     if m > 10:
  7.         Y = year - 1
  8.     else:
  9.         Y = year
  10.     y = Y % 100
  11.     c = (Y - (Y % 100)) / 100

  12.     w = (d + floor(2.6 * m - 0.2) + y + floor(y/4) + floor(c/4) - 2*c) % 7

  13.     return int(w)

  14. def count_sundays(year_s=1901,year_e=2000):
  15.     day = 0
  16.     total = 0
  17.     for year in range(year_s, year_e + 1):
  18.         for month in range(1,13):
  19.             if day_of_week(year, month, 1) == day: total += 1
  20.     return total

  21. start = time.time()

  22. total = count_sundays()

  23. print('20世纪一共有%s个星期日落在了当月的第一天'%str(total))
  24. print('用时%s秒'%str(time.time() - start))
复制代码


答案是:
  1. 20世纪一共有171个星期日落在了当月的第一天
  2. 用时0.002000093460083008秒
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-30 20:32:19 | 显示全部楼层
本帖最后由 小火木 于 2016-6-5 12:13 编辑
  1. def month_list(year):
  2.     if (year%4==0 and year %100!=0) or year %400==0:
  3.         return [[1,31],[2,29],[3,31],[4,30],[5,31],[6,30],[7,31],[8,31],[9,30],[10,31],[11,30],[12,31]]
  4.     else:
  5.         return [[1,31],[2,28],[3,31],[4,30],[5,31],[6,30],[7,31],[8,31],[9,30],[10,31],[11,30],[12,31]]


  6. offset=0
  7. count=0
  8. data=[]
  9. for year in range (1900,2001):
  10.     months=month_list(year)
  11.     for month in months:
  12.         offset=(month[1]+offset)%7
  13.         if offset==6   and year>1900:
  14.             count+=1
  15.             data.append([year,month[0]+1])

  16. print('20世纪一共有%d个星期日落在了当月的第一天'% count)
复制代码


附加题
  1. from functools import reduce
  2. print(sum(int(x) for x in list(str(reduce(lambda x,y: x*y , range(1,101))))))
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-31 08:10:22 | 显示全部楼层
  1. def days(years):
  2.       if(not(years%4) and (years%100) or not years%400):
  3.             return 1
  4.       else:
  5.             return 0
  6. week=6
  7. b=0
  8. for i in range(1900,2001):
  9.       if(days(i)):
  10.             iii=[31,29,31,30,31,30,31,31,30,31,30,31]
  11.       else:
  12.             iii=[31,28,31,30,31,30,31,31,30,31,30,31]
  13.       for ii in iii:
  14.             if week==6:
  15.                   b+=1
  16.             week=(week+ii)%7
  17. import math
  18. a=str(math.factorial(100))
  19. su=0
  20. for i in a:
  21.       su+=int(i)

  22. print(b,su)
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-5-31 14:55:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 19:27:59 | 显示全部楼层
本帖最后由 Spicebush 于 2016-5-31 20:51 编辑

先占坑完成附加题:
结果为:648
代码如下:
  1. from math import factorial
  2. sum([int(i) for i in str(factorial(100))])
复制代码


查了一下万年历,1901年1月1日是星期二,2001年1月1日是星期一,
故编写代码如下:
  1. day = 0
  2. md = 2
  3. for year in range(1901,2001):
  4.     if (year%4==0 and year%100!=0) or (year%400==0):
  5.         mon = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  6.     else:
  7.         mon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  8.     for n in mon:
  9.         md += n
  10.         if md%7==0:
  11.             day += 1
  12. print(day)
复制代码

求得结果为:171

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-1 09:20:20 | 显示全部楼层
本帖最后由 WylLy 于 2016-6-2 07:24 编辑

20 世纪(1901 年 1 月 1 日到 2000 年 12 月 31 日)一共有多少个星期日落在了当月的第一天?
  1. #coding:utf-8
  2. import time

  3. def last_day(day):
  4.     global month_last_day_week
  5.     while day:
  6.         if month_last_day_week == 7:
  7.             month_last_day_week = 1
  8.         else:
  9.             month_last_day_week += 1
  10.         day -= 1

  11. lt = []
  12. month_last_day_week = 7
  13. t1 = time.time()
  14. for year in range(1900, 2001):
  15.     for month in range(1, 13):

  16.         if month_last_day_week == 6:
  17.             lt.append(str(year) + '-' + str(month))

  18.         if month in [4,6,9,11]:
  19.             day = 2         #减去28后的值
  20.         elif month == 2:
  21.             day = 8 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) else 7      #减去21后的值
  22.         else:
  23.             day = 3         #减去28后的值
  24.         last_day(day)
  25. t2 = time.time()
  26. print('一共有:',len(lt))
  27. print('它们是:',lt)
  28. print('运行所耗的时间是:', (t2-t1))
复制代码


结果:
  1. 一共有: 173
  2. 它们是: ['1900-4', '1900-7', '1901-9', '1901-12', '1902-6', '1903-2', '1903-3', '1903-11', '1904-5', '1905-1', '1905-10', '1906-4', '1906-7', '1907-9', '1907-12', '1908-3', '1908-11', '1909-8', '1910-5', '1911-1', '1911-10', '1912-9', '1912-12', '1913-6', '1914-2', '1914-3', '1914-11', '1915-8', '1916-10', '1917-4', '1917-7', '1918-9', '1918-12', '1919-6', '1920-2', '1920-8', '1921-5', '1922-1', '1922-10', '1923-4', '1923-7', '1924-6', '1925-2', '1925-3', '1925-11', '1926-8', '1927-5', '1928-1', '1928-4', '1928-7', '1929-9', '1929-12', '1930-6', '1931-2', '1931-3', '1931-11', '1932-5', '1933-1', '1933-10', '1934-4', '1934-7', '1935-9', '1935-12', '1936-3', '1936-11', '1937-8', '1938-5', '1939-1', '1939-10', '1940-9', '1940-12', '1941-6', '1942-2', '1942-3', '1942-11', '1943-8', '1944-10', '1945-4', '1945-7', '1946-9', '1946-12', '1947-6', '1948-2', '1948-8', '1949-5', '1950-1', '1950-10', '1951-4', '1951-7', '1952-6', '1953-2', '1953-3', '1953-11', '1954-8', '1955-5', '1956-1', '1956-4', '1956-7', '1957-9', '1957-12', '1958-6', '1959-2', '1959-3', '1959-11', '1960-5', '1961-1', '1961-10', '1962-4', '1962-7', '1963-9', '1963-12', '1964-3', '1964-11', '1965-8', '1966-5', '1967-1', '1967-10', '1968-9', '1968-12', '1969-6', '1970-2', '1970-3', '1970-11', '1971-8', '1972-10', '1973-4', '1973-7', '1974-9', '1974-12', '1975-6', '1976-2', '1976-8', '1977-5', '1978-1', '1978-10', '1979-4', '1979-7', '1980-6', '1981-2', '1981-3', '1981-11', '1982-8', '1983-5', '1984-1', '1984-4', '1984-7', '1985-9', '1985-12', '1986-6', '1987-2', '1987-3', '1987-11', '1988-5', '1989-1', '1989-10', '1990-4', '1990-7', '1991-9', '1991-12', '1992-3', '1992-11', '1993-8', '1994-5', '1995-1', '1995-10', '1996-9', '1996-12', '1997-6', '1998-2', '1998-3', '1998-11', '1999-8', '2000-10']
  3. 运行所耗的时间是: 0.002001047134399414
复制代码


附加题

  1. import math
  2. import time
  3. t3 = time.time()
  4. for i in range(100):
  5.     d = math.factorial(100)
  6.     result = 0
  7.     for i in str(d):
  8.         result += int(i)
  9. t4 = time.time()
  10. print('100! 的各位之和是:',result)
  11. print('运行100次所耗的时间是:',(t4-t3))
复制代码


附加题结果:
  1. 100! 的各位之和是: 648
  2. 运行100次所耗的时间是: 0.008004903793334961
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-1 20:14:21 | 显示全部楼层
顶顶顶顶顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-2 10:00:33 | 显示全部楼层
本帖最后由 shichaoufo 于 2016-6-6 16:41 编辑
  1. year = 1900
  2. month = 1
  3. day = 7
  4. is_Feb = False
  5. is_RunYue = True
  6. is_RunNian = False
  7. num = 0
  8. day_num = 31

  9. while True:
  10.     #判断是否闰年
  11.     if year % 200 == 0:
  12.         if year % 400 == 0:
  13.             is_RunNian = True

  14.     elif year % 4 == 0:
  15.         is_RunNian = True

  16.     else:
  17.         is_RunNian = False
  18.         
  19.     #判断月份
  20.     if month in [1,3,5,7,8,10,12]:
  21.         is_RunYue = True
  22.         is_Feb = False
  23.     elif month in [4,6,9,11]:
  24.         is_RunYue = False
  25.         is_Feb = False
  26.     else:
  27.         is_RunYue = False
  28.         is_Feb = True
  29.         
  30.     #判断一个月该有多少天  
  31.     if is_RunYue:
  32.         day_num = 31
  33.     elif is_RunNian and is_Feb:
  34.         day_num = 29
  35.     elif not is_RunNian and is_Feb:
  36.         day_num = 28
  37.     else:
  38.         day_num = 30
  39.         
  40.     #记录是否是每月第一天   
  41.     if year > 1900 and day == 1:
  42.         num += 1
  43.         print("%d年%d月%d日" % (year,month,day))
  44.         
  45.     #更新日期
  46.     day += 7
  47.     if day > day_num:
  48.         day = day - day_num
  49.         month += 1
  50.         if month > 12:
  51.             month = 1
  52.             year += 1

  53.     if year > 2000:
  54.         break

  55. print("一共有%d个星期日落在了当月的第一天" % num)
  56.    
复制代码


附加题
方法1:

  1. a = 1
  2. ge_wei = []
  3. he = 0
  4. for i in range(1,101):
  5.     a = a * i
  6. #算出100!是个几位数
  7. b = a
  8. c = 0
  9. while True:
  10.     b = b // 10
  11.     c += 1
  12.     if b == 0:
  13.         break

  14. for i in range(c-1,0,-1):
  15.     d = a // pow(10,i)
  16.     if d != 0:
  17.         ge_wei.append(d)
  18.         a = a % pow(10,i)
  19.     if a == 0:
  20.         break

  21. for i in ge_wei:
  22.     he += i

  23. print("各位之和为:%d" % he)
复制代码


方法2:
  1. a = 1
  2. ge_wei = []
  3. he = 0
  4. for i in range(1,101):
  5.     a = a * i
  6. x = str(a)

  7. for i in x:
  8.     he += int(i)

  9. print("各位之和为:%d" % he)
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-2 16:49:57 | 显示全部楼层
本帖最后由 leozyre 于 2016-6-2 16:51 编辑

python2.7
第一题
  1. def feb(now_year):
  2.     if (year % 4 == 0) and (year % 400 != 0):
  3.         global day,month
  4.         day += 29
  5.         month += 1
  6.     else:
  7.         global day,month
  8.         day += 28
  9.         month += 1

  10. def big_month():
  11.     global day,month
  12.     month += 1
  13.     day += 31

  14. def sma_month():
  15.     global day,month
  16.     month += 1
  17.     day += 30

  18. add_month = [1,3,5,7,8,10]
  19. nol_month = [4,6,9,11]
  20. year = 1900
  21. month = 1
  22. day = 1
  23. wee = 0
  24. while (2000 - year):
  25.     if month == 12:
  26.         month = 1
  27.         day += 31
  28.         year += 1
  29.     elif month in add_month:
  30.         big_month()
  31.     elif month in nol_month:
  32.         sma_month()
  33.     else:
  34.         feb(year)
  35.     if day % 7 == 0:
  36.         wee += 1
  37. print wee
复制代码

结果是171
附加题
  1. def fast(x):
  2.     if x == 1:
  3.         return x
  4.     else:
  5.         return x * fast(x - 1)

  6. add = 0
  7. num = fast(100)
  8. while num:
  9.     add  += num % 10
  10.     num //= 10
  11.    
  12. print add
  13.      
复制代码

结果是648

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-2 22:14:20 | 显示全部楼层
xuexi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-3 11:25:36 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-3 16:36:26 | 显示全部楼层
使用的是python27
新手,抓破头皮才做出来,不过运行时间有点长,能否给我一份有效率的答案参考一下,谢谢

练习题1
  1. # --*-- coding: utf-8 --*--

  2. #闰年
  3. def leapYear(year):
  4.     Feb = 28
  5.     if year % 4 == 0:
  6.         Feb = 29
  7.     if year % 100 == 0 and year % 400 != 0:
  8.         Feb = 28
  9.     return Feb

  10. #每个月的天数
  11. def dates(year):
  12.     month = [['Jan', 31], ['Mar', 31], ['Apr', 30], ['May', 31], ['Jun', 30], ['Jul', 31], \
  13.              ['Aug', 31], ['Sep', 30], ['Oct', 31], ['Nov', 30], ['Dec', 31]]
  14.     February =['Feb']
  15.     for m in range(1,13):
  16.         Feb = leapYear(year)
  17.     February.append(Feb)
  18.     month.insert(1,February)
  19.     return month

  20. #与1900年相差的月份
  21. def months(year, month):
  22.     monday = []
  23.     for y in range(1900, year + 1):
  24.         for m in range(1, 13):
  25.             if y == year and m == month:
  26.                 break
  27.             monday.append(dates(y)[m - 1][1])
  28.     return monday

  29. #与1900年相差的天数
  30. def days(year, month, day):
  31.     allyearday = []
  32.     for m in months(year, month):
  33.         for d in range(1, m + 1):
  34.             allyearday.append(d)
  35.     for lastmonday in range(1, day + 1):
  36.         allyearday.append(lastmonday)
  37.     return allyearday

  38. def weeks(year, month, day):
  39.     week = 0
  40.     for w in days(year, month, day):
  41.         week += 1
  42.         if week > 7:
  43.             week = 1
  44.     return week

  45. def sumMon(year, month):
  46.     sum = 0
  47.     for y in range(1901,year + 1):
  48.         for m in range(1, 13):
  49.             if weeks(y, m, 1) == 7:
  50.                 sum += 1
  51.             if y == year and m == month:
  52.                 break
  53.     return sum

  54. if __name__ == '__main__':
  55.     print sumMon(2000,12)
复制代码


附加题
  1. def numSum(n):
  2.     product, sum = 1, 0

  3.     for i in range(n, 0, -1):
  4.         product *= i
  5.     for j in str(product):
  6.         sum += int(j)

  7.     return sum

  8. if __name__ == '__main__':
  9.     print numSum(100)
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-3 22:14:55 | 显示全部楼层
本帖最后由 EggyBruch 于 2016-6-3 22:35 编辑
  1. import time
  2. year = 1900
  3. month = 1
  4. day = 1
  5. date = 1
  6. week = [1,2,3,4,5,6,7]
  7. count = 0
  8. i = 0
  9. j = 0
  10. startTime = time.time()
  11. while year <= 2000:
  12.     month  = 1
  13.     while month <= 12:
  14.         date = 1
  15.         if month == 2:
  16.             if (year%4 == 0) and (year%100 != 0)or (year%400 == 0):
  17.                 day = 29
  18.             else:
  19.                 day = 28
  20.         elif (month == 4)or(month == 6)or(month ==9)or (month == 11):
  21.             day = 30
  22.         else:
  23.             day = 31
  24.         i = j
  25.         while date <= day:
  26.             week[i]= date
  27.             i += 1
  28.             date += 1
  29.             if i == 6:
  30.                 if week[6] == 1:
  31.                     if year >= 1901:
  32.                         count += 1
  33.             if i == 7:
  34.                 i = 0
  35.         j = i
  36.         month += 1
  37.     year += 1
  38. print ('count = ',count)
  39. print ('read: %.3fs'%(time.time()-startTime))
  40.                
  41.          
复制代码

count =  171
read: 0.141s
-------------附加题-----------------
  1. def amount(n):
  2.     product = 1
  3.     s = 0
  4.     tempory = int(n)
  5.     for i in range(1,tempory+1):
  6.         product *= i
  7.     product_list= str(product)
  8.     for x in product_list:
  9.         cal = int(x)   
  10.         s += cal
  11.     return s
  12.    
  13.    
复制代码

amount (100) = 648

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-3 23:02:52 | 显示全部楼层
严重支持
  1. def addToDate(date):
  2.     yy, mm, dd, ww = date

  3.     ww = ww + 1
  4.     if ww == 8:
  5.         ww = 1

  6.     dd = dd + 1
  7.     if mm in [4, 6, 9, 11]:
  8.         if dd == 31:
  9.             dd = 1
  10.             mm = mm + 1
  11.     elif mm in [1, 3, 5, 7, 8, 10, 12]:
  12.         if dd == 32:
  13.             dd = 1
  14.             mm = mm + 1
  15.             if mm == 13:
  16.                 mm = 1
  17.                 yy = yy + 1
  18.     elif mm == 2:
  19.         feb = 28
  20.         if yy%4 == 0:
  21.             feb = 29
  22.             if yy%100 == 0 and yy%400 != 0:
  23.                 feb = 28
  24.         if dd == feb + 1:
  25.             dd = 1
  26.             mm = 3

  27.     date = (yy, mm, dd, ww)

  28.     return date


  29. date = (1900, 1, 1, 1)
  30. while True:
  31.     date = addToDate(date)
  32.     if date[:3] == (1901, 1, 1):
  33.         break

  34. i = 0
  35. while True:
  36.     date = addToDate(date)
  37.     if date[2] == 1 and date[3] == 7:
  38.         #print(date)
  39.         i += 1
  40.     if date[:3] == (2000, 12, 31):
  41.         break

  42. print('符合条件的日期有 %d 个'%i)

  43. from math import factorial
  44. print('附加题:%d'%sum([int(each) for each in str(factorial(100))]))
复制代码

运行结果
  1. >>>
  2. 符合条件的日期有 171 个
  3. 附加题:648
  4. >>>
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-4 06:00:40 | 显示全部楼层
本帖最后由 老忘 于 2016-6-4 06:53 编辑

1.计算每月1日为周日的天数(datetime可以用吗?):
  1. #-*- coding: UTF-8 -*-
  2. from datetime import *
  3. day_count=0
  4. for year in range(1901,2001):
  5.     for month in range(1,13):
  6.         d1=date(year,month,1)
  7.         if int(d1.strftime('%w'))==0 :
  8.             day_count+=1
  9. print(day_count)
复制代码


2、附件题(计算阶乘位数之和):
  1. #-*- coding: UTF-8 -*-
  2. import time
  3. a = time.clock()

  4. def factorial(num):
  5.     sum_data=1
  6.     for i in range(num,0,-1):
  7.         sum_data*=i
  8.     return sum_data

  9. result_sum=0
  10. factorial_mulit=1
  11. for i in(100,1,-1):
  12.     factorial_mulit*=factorial(i)
  13. for eachone in str(factorial_mulit):
  14.     result_sum+=int(eachone)
  15. print (result_sum)
  16. b = time.clock()

  17. print ("read: %f s" % (b - a))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-4 11:32:56 | 显示全部楼层
第一次回复不知道是回附件还是代码先附上代码和答案
题目:  程序结果:170
moreDays = 0
monthFirstDay = []
dayCount = 1
sundayCount = 0
if 1900 % 4 == 0 :
        moreDays = 365
else:
        moreDays = 366
#1901-01~2000-12的每月第一天
for i in range(1901,2001):
        for j in range(1,13):
                monthFirstDay.append(dayCount)
                if (j==2):
                        if (i % 4 == 0) and (i % 400 != 0):
                                dayCount += 29
                        else :
                                dayCount += 28
                elif (j == 4 or j == 6 or j == 9 or j== 11):
                        dayCount += 30
                else :
                        dayCount += 31
               

for i in monthFirstDay :
        if (i + moreDays) % 7 == 6 :
                sundayCount += 1
               
print("有多少个星期日落在了当月的第一天?\n" ,sundayCount)


附加题: 程序结果:648
sum = 100
answer = 0
for i in range(100,1,-1) :
        sum *= i
sum = str(sum)
for i in sum :
        answer += int(i)
print(answer)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2016-6-5 15:11:52 | 显示全部楼层
本帖最后由 挥舞乾坤 于 2016-6-5 15:14 编辑
  1. def isrunnian(year):
  2.     # 是否闰年
  3.     if year % 100 == 0:
  4.         return not year % 400
  5.     else:
  6.         return not year % 4

  7. def month_days(y,m):
  8.     #一个月有多少天
  9.     if m == 2:
  10.         if isrunnian(y):
  11.             return 29
  12.         else:
  13.             return 28
  14.     if m in [4,6,9,11]:
  15.         return 30
  16.     else:
  17.         return 31

  18. def main(begin_year=1901,end_year=2000):
  19.     count = 0
  20.     for year in range(1900, end_year+1):
  21.         for month in range(1,13):
  22.             if year == 1900 and month == 1:
  23.                 oneday = 1 #当前月份的第一天是星期几
  24.             else:
  25.                 oneday += nomber_of_day % 7
  26.                 if oneday > 7:
  27.                     oneday -= 7
  28.             nomber_of_day = month_days(year,month)
  29.             if oneday == 7 and year >= begin_year:
  30.                 count += 1
  31.     return count

  32. print(main())
复制代码

附加题:
  1. print(sum(map(int,str((lambda self,n: 1 if n==1 else n * self(self,n-1))((lambda self,n: 1 if n==1 else n * self(self,n-1)),100)))))
复制代码

评分

参与人数 1荣誉 +8 鱼币 +8 收起 理由
冬雪雪冬 + 8 + 8 热爱鱼C^_^

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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