鱼C论坛

 找回密码
 立即注册
查看: 2777|回复: 11

Python3生存天数计算器求助

[复制链接]
发表于 2017-9-3 14:59:05 | 显示全部楼层 |阅读模式

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

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

x
一开始我是粗心,发现每四年有少1天误差,仔细检查后发现把生日那天到公元元年的天数里的闰年总数本应该是rn的错写成了RN。
虽然说可以直接通过+‘年龄//4’来补正,但是后来把RN恢复成正确的rn后误差反而更大了,求问为什么。
新手,可能哪边表达不清楚。希望有大神解惑
下面附上自以为本应正确的代码
  1. while 666 :
  2.     print ('———计算你活了多少天———')
  3.     a = int (input ('今天是哪年:'))
  4.     b = int (input ('哪月:'))
  5.     c = int (input ('哪日:'))
  6.     x = int (input ('你出生在哪年:'))
  7.     y = int (input ('哪月:'))
  8.     z = int (input ('哪日:'))
  9.     RN = (a//4) - (a//100) + (a//400) # 到公元元年的闰年总数
  10.     rn = (x//4) - (x//100) - (x//400) # 到公元元年的闰年总数
  11.     if b == 1 :
  12.         if 0 < c < 32 :
  13.             if 0 == a%4 or 0 == a%400 :
  14.                 m = (a-1)*365+c+RN-1
  15.             else :
  16.                 m = (a-1)*365+c+RN
  17.         else :
  18.             print ('输入错误!')
  19.     if b == 2 :
  20.         if 0 < c <30 :
  21.             if (0 == a%4 or 0 == a%400) :
  22.                 m = (a-1)*365+31+c+RN-1
  23.             elif c == 29 :
  24.                 print ('输入错误!')
  25.             else :
  26.                 m = (a-1)*365+31+c+RN
  27.         else :
  28.             print ('输入错误!')
  29.     if b == 3 :
  30.         if 0 < c < 32 :
  31.             m = (a-1)*365+59+c+RN
  32.         else :
  33.             print ('输入错误!')
  34.     if b == 4 :
  35.         if 0 < c < 31 :
  36.             m = (a-1)*365+90+c+RN
  37.         else :
  38.             print ('输入错误!')
  39.     if b == 5 :
  40.         if 0 < c < 32 :
  41.             m = (a-1)*365+120+c+RN
  42.         else :
  43.             print ('输入错误!')
  44.     if b == 6 :
  45.         if 0 < c < 31 :
  46.             m = (a-1)*365+151+c+RN
  47.         else :
  48.             print ('输入错误!')
  49.     if b == 7 :
  50.         if 0 < c < 32 :
  51.             m = (a-1)*365+181+c+RN
  52.         else :
  53.             print ('输入错误!')
  54.     if b == 8 :
  55.         if 0 < c < 32 :
  56.             m = (a-1)*365+212+c+RN
  57.         else :
  58.             print ('输入错误!')
  59.     if b == 9 :
  60.         if 0 < c < 31 :
  61.             m = (a-1)*365+243+c+RN
  62.         else :
  63.             print ('输入错误!')
  64.     if b == 10 :
  65.         if 0 < c < 32 :
  66.             m = (a-1)*365+273+c+RN
  67.         else :
  68.             print ('输入错误!')
  69.     if b == 11 :
  70.         if 0 < c < 31 :
  71.             m = (a-1)*365+304+c+RN
  72.         else :
  73.             print ('输入错误!')
  74.     if b == 12 :
  75.         if 0 < c < 32 :
  76.             m = (a-1)*365+334+c+RN
  77.         else :
  78.             print ('输入错误!')
  79.     if y == 1 :
  80.         if 0 < z < 32 :
  81.             if 0 == x%4 or 0 == x%400 :
  82.                 n = (x-1)*365+z+rn-1
  83.             else :
  84.                 n = (x-1)*365+z+rn
  85.         else :
  86.             print ('输入错误!')
  87.     if y == 2 :
  88.         if 0 < z <30 :
  89.             if (0 == x%4 or 0 == x%400) :
  90.                 n = (x-1)*365+31+z+rn-1
  91.             elif z == 29 :
  92.                 print ('输入错误!')
  93.             else :
  94.                 n = (x-1)*365+31+z+rn
  95.         else :
  96.             print ('输入错误!')
  97.     if y == 3 :
  98.         if 0 < z < 32 :
  99.             n = (x-1)*365+59+z+rn
  100.         else :
  101.             print ('输入错误!')
  102.     if y == 4 :
  103.         if 0 < z < 31 :
  104.             n = (x-1)*365+90+z+rn
  105.         else :
  106.             print ('输入错误!')
  107.     if y == 5 :
  108.         if 0 < z < 32 :
  109.             n = (x-1)*365+120+z+rn
  110.         else :
  111.             print ('输入错误!')
  112.     if y == 6 :
  113.         if 0 < z < 31 :
  114.             n = (x-1)*365+151+z+rn
  115.         else :
  116.             print ('输入错误!')
  117.     if y == 7 :
  118.         if 0 < z < 32 :
  119.             n = (x-1)*365+181+z+rn
  120.         else :
  121.             print ('输入错误!')
  122.     if y == 8 :
  123.         if 0 < z < 32 :
  124.             n = (x-1)*365+212+z+rn
  125.         else :
  126.             print ('输入错误!')
  127.     if y == 9 :
  128.         if 0 < z < 31 :
  129.             n = (x-1)*365+243+z+rn
  130.         else :
  131.             print ('输入错误!')
  132.     if y == 10 :
  133.         if 0 < z < 32 :
  134.             n = (x-1)*365+273+z+rn
  135.         else :
  136.             print ('输入错误!')
  137.     if y == 11 :
  138.         if 0 < z < 31 :
  139.             n = (x-1)*365+304+z+rn
  140.         else :
  141.             print ('输入错误!')
  142.     if y == 12 :
  143.         if 0 < z < 32 :
  144.             n = (x-1)*365+334+z+rn
  145.         else :
  146.             print ('输入错误!')
  147.     q = m - n
  148.     Q = str (q)
  149.     print ('您在《地球Online》登陆时长为:'+ Q + '天')

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-9-3 15:12:14 | 显示全部楼层
把两个天数单独拉出来算的天数都是对的,但是一相减就会有误差。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-3 16:54:52 | 显示全部楼层
这程序,,,我无语了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-3 18:32:37 | 显示全部楼层
新手·ing 发表于 2017-9-3 16:54
这程序,,,我无语了

虽然说已经找到问题所在了,但还是想问问大神有没有什么更好的程序能达到这个效果···
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-3 18:34:19 | 显示全部楼层
问题出在第10行···
-号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-6 15:28:56 | 显示全部楼层
新手·ing 发表于 2017-9-3 16:54
这程序,,,我无语了

?????????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:15:49 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-9-6 16:20 编辑
木子枫 发表于 2017-9-3 18:32
虽然说已经找到问题所在了,但还是想问问大神有没有什么更好的程序能达到这个效果···

  1. from datetime import datetime
  2. import re
  3. bir_year, bir_month, bir_day = input('Your birthday: (eg. 1983-01-01)').split('-')
  4. df = datetime.today()-datetime(int(bir_year), int(bir_month), int(bir_day))
  5. res = re.findall('^(\d+) day.*', str(df))
  6. print('You have lived %s days.' % res[0] if res else 'Input Error')
复制代码

Your birthday: (eg. 1983-01-01) 1982-12-20
You have lived 12679 days.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:20:14 | 显示全部楼层
jerryxjr1220 发表于 2017-9-6 16:15
Your birthday: (eg. 1983-01-01) 1982-12-20
You have lived 12679 days.

不必用正则,df.days就得到天数了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:23:50 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-9-6 16:25 编辑
冬雪雪冬 发表于 2017-9-6 16:20
不必用正则,df.days就得到天数了。


我用正则是为了避免出现0或者负数的天数。

不过也可以用df.days>0来判断。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:25:39 | 显示全部楼层
jerryxjr1220 发表于 2017-9-6 16:23
我用正则是为了避免出现0或者负数的天数。

明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:29:48 | 显示全部楼层

确实这样更简洁
  1. from datetime import datetime
  2. bir_year, bir_month, bir_day = input('Your birthday: (eg. 1983-01-01)').split('-')
  3. df = datetime.today()-datetime(int(bir_year), int(bir_month), int(bir_day))
  4. print('You have lived %s days.' % str(df.days) if df.days>0 else 'Input Error')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-6 22:42:26 | 显示全部楼层

厉害了,刚开始学,还没学到datetime,只能用笨办法,受益匪浅
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-23 15:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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