鱼C论坛

 找回密码
 立即注册
楼主: ooxx7788

[技术交流] Python: 每日一题 38

[复制链接]
发表于 2017-5-17 20:48:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-23 08:53:35 From FishC Mobile | 显示全部楼层
我就来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 19:13:57 | 显示全部楼层
居然先想到暴力破解,以前学数学的时候绝对不是这样想问题的···
  1. # 首先想到,可以暴力破解吗?想法很美啊,哈哈哈,就是大数效率低
  2. def f_1(num):
  3.     n = num
  4.     for i in range(1,num+1):
  5.         if '4' in str(i):
  6.             n -= 1
  7.     return n
复制代码

要求效率那肯定有窍门嘛,试下按权重来处理咯
  1. # 算不算是9进制?关键在当前数字>4 的就-1
  2. def f_2(num):
  3.     a = [int(i) for i in reversed(str(num))]
  4.     output = 0
  5.     for j in range(len(a)):
  6.         if a[j] > 4:
  7.             a[j] -= 1
  8.         output += a[j]*9**j
  9.     print(output)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-26 19:26:40 | 显示全部楼层
···  ···
答案那两个方法,见都没见过
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-20 15:16:13 | 显示全部楼层
  1. a = input()
  2. a = int(a)
  3. b = 4
  4. num = 0

  5. while True:
  6.     if a - b >= 0 :
  7.         num += 1
  8.         b += 10
  9.     else :
  10.         break

  11. print(a-num)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-20 15:24:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-5 08:36:17 | 显示全部楼层
  1. 开始以为只是各位变4时直接变成5,后来对照答案,excel一对照,原来是十位、百位变4都会跳到5,于是就不会做了。还要好好再想想。
复制代码
wxid_mlhj1sszbna021_1512433933021_32.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 14:47:10 | 显示全部楼层
答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-15 14:27:10 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-1-15 14:37 编辑
  1. def assert_equals(func, target, *args):
  2.     if func == target:
  3.         print('Success!')
  4.     else:
  5.         print('Fail!{0} not equals {1}'.format(func, target))
  6.         print(*args)

  7. def faulty_odometer(n):
  8.     real = 0
  9.     display = 0
  10.     while True:
  11.         real += 1
  12.         display += 1
  13.         s = ['5' if i == '4' else i for i in str(display)]
  14.         display = int(''.join(s))
  15.         if display == n:
  16.             return real

  17. assert_equals(faulty_odometer(13), 12)
  18. assert_equals(faulty_odometer(15), 13)
  19. assert_equals(faulty_odometer(55), 40)
  20. assert_equals(faulty_odometer(2005), 1462)
  21. assert_equals(faulty_odometer(1500), 1053)
  22. assert_equals(faulty_odometer(999999), 531440) # display = 999999,要2.4秒
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-21 20:56:05 | 显示全部楼层
def real_show(num):
    real, show = 0, 0
    while show < num:
        real += 1
        show += 1
        if '4' in str(show):
            show = int(str(show).replace('4','5'))
    print(show,real)
real_show(999999)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-13 14:57:02 | 显示全部楼层
  1. def fun(n):
  2.    a = [i for i in range(n+1) if not('4' in str(i))]
  3.    print("%d,%d" % (n,a.index(n)))

  4. if __name__=="__main__":
  5.     fun(999999)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 16:12:30 | 显示全部楼层
def faulty_odometer(number):
    real, show, delt = 0, number, 0
    lent = len(str(number))
    print(lent)
    for i in range(lent-1, 0, -1):
        k = 10 ** i
        j = number // k
      
        delt += j * (10 ** (i-1))
        number = number - j*k
        print("k%d, j%d, number%d,delt%d"%(k,j, number,delt))
    if number > 4:
        delt += 1
    real =  show - delt
    return show, real
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-12 13:33:15 | 显示全部楼层
改2#楼大佬的
def count(n):
  real, show = 0, 0
  while show < n:
    real += 1
    show += 1
    if '4' in str(show):
      show = str(show)
      show = show.replace('4','5')
      show = int(show)
  else:
    return real
   
print(count(999999))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-18 16:26:08 | 显示全部楼层
交个作业,测试结果还是正确的。
inp_num = input('please input the number:')
count = 0

for i in range(int(inp_num)):
    if i%10 != 4:
        count += 1
print(count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-18 16:35:10 | 显示全部楼层
jiazhiyu 发表于 2018-4-18 16:26
交个作业,测试结果还是正确的。
inp_num = input('please input the number:')
count = 0

不过数字比较大的时候,运行的好慢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 23:01:28 | 显示全部楼层
貌似最后一个计算时间比较长
  1. 代码:
  2. import test
  3. def faulty_odometer(x):
  4.     y = 0
  5.     for i in range(x):
  6.         i = str(i)
  7.         if '4' not in i:
  8.             y += 1
  9.     return y
  10.    
  11. test.assert_equals(faulty_odometer(13), 12)
  12. test.assert_equals(faulty_odometer(15), 13)
  13. test.assert_equals(faulty_odometer(55), 40)
  14. test.assert_equals(faulty_odometer(2005), 1462)
  15. test.assert_equals(faulty_odometer(1500), 1053)
  16. test.assert_equals(faulty_odometer(999999), 531440)
  17. test.assert_equals(faulty_odometer(165826622), 69517865)

  18. 结果:
  19. Success!
  20. Success!
  21. Success!
  22. Success!
  23. Success!
  24. Success!
  25. Success!
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-19 13:05:06 | 显示全部楼层
思考中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 14:26:58 | 显示全部楼层
  1. def real_kilometer(k):
  2.     dif = 0
  3.     n = 1
  4.     while n<=k:
  5.         init_n = str(n)
  6.         if '4' in init_n:
  7.             new_n = init_n.replace('4','5')
  8.             dif+=int(new_n)-n
  9.             n=int(new_n)
  10.         else:
  11.             n+=1
  12.     return k -dif
复制代码

能实现,就是跑最后一个数据的时候时间比较久。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-7 16:07:59 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 15:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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