鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: zltzlt

[技术交流] Python:每日一题 249(答题有奖)

[复制链接]
发表于 2019-9-29 22:53:17 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-9-29 23:03 编辑
这层楼请删,在没看回复的情况居然发了出来
更新版本,在连续使用函数时,效率相对提高。
  1. 错误结果缓存 = set()
  2. def 求解(数):
  3.     数集 = {数}
  4.     def 替换(旧数):
  5.         新数 = 0
  6.         while 旧数:
  7.             新数 += (旧数%10) ** 2
  8.             旧数 //= 10
  9.         return 新数

  10.     def 已知错误(数):
  11.         return (数 in 错误结果缓存)
  12.    
  13.     if 已知错误(数):
  14.         return False
  15.     数 = 替换(数)
  16.     while 数 not in 数集:      #若出现重复数字当为无限循环
  17.         if 已知错误(数):       #使用排除法
  18.             return False
  19.         
  20.         数集.add(数)
  21.         数 = 替换(数)
  22.         if 数 == 1:            #出现1则返回真,结束函数
  23.             return True
  24.     for 元素 in 数集:
  25.         global 错误结果缓存
  26.         错误结果缓存.add(元素) #将错误结果放入缓存以提高连续使用的效率
  27.     return False               #出现无限循环且没有1,返回假,结束函数

  28. if __name__ == '__main__':
  29.     print("例1 输出:", 求解(19))
  30.     print("自测(实算得假) 输出:", 求解(233))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-29 22:59:57 | 显示全部楼层
zltzlt 发表于 2019-9-29 20:42
解答错误

输入:1

我居然忽视了 1 的情况,惭愧……补上新的代码:
  1. 错误结果缓存 = set()
  2. def 求解(数):
  3.     if 数 == 1:
  4.         return True
  5.     数集 = {数}
  6.     def 替换(旧数):
  7.         新数 = 0
  8.         while 旧数:
  9.             新数 += (旧数%10) ** 2
  10.             旧数 //= 10
  11.         return 新数

  12.     def 已知错误(数):
  13.         return (数 in 错误结果缓存)
  14.    
  15.     if 已知错误(数):
  16.         return False
  17.     数 = 替换(数)
  18.     while 数 not in 数集:      #若出现重复数字当为无限循环
  19.         if 已知错误(数):       #使用排除法
  20.             return False
  21.         
  22.         数集.add(数)
  23.         数 = 替换(数)
  24.         if 数 == 1:            #出现1则返回真,结束函数
  25.             return True
  26.     for 元素 in 数集:
  27.         global 错误结果缓存
  28.         错误结果缓存.add(元素) #将错误结果放入缓存以提高连续使用的效率
  29.     return False               #出现无限循环且没有1,返回假,结束函数

  30. if __name__ == '__main__':
  31.     print("例1 输出:", 求解(19))
  32.     print("自测(实算得假) 输出:", 求解(233))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

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

使用道具 举报

发表于 2019-9-30 15:03:03 | 显示全部楼层
  1. def happynum(num):
  2.     sum=0
  3.     temp=str(num)
  4.     for each in temp:
  5.         sum+=int(each)**2
  6.         if sum==1:
  7.             print('是快乐数')
  8.             break
  9.         else:
  10.             num=sum
  11.             return happynum(num)


  12. num=int(input('输入一个正整数:'))
  13. try:
  14.     happynum(num)
  15. except RecursionError:
  16.     print('不是快乐数')

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

使用道具 举报

 楼主| 发表于 2019-10-3 16:12:17 | 显示全部楼层
阴阳神万物主 发表于 2019-9-29 22:53
这层楼请删,在没看回复的情况居然发了出来
更新版本,在连续使用函数时,效率相对提高。

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

使用道具 举报

 楼主| 发表于 2019-10-3 16:18:16 | 显示全部楼层
阴阳神万物主 发表于 2019-9-29 22:59
我居然忽视了 1 的情况,惭愧……补上新的代码:

恭喜通过!

执行用时:44 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-8 00:04:26 From FishC Mobile | 显示全部楼层
def happynum(num):
    res=str(num)
    a=0
    for each in res:
        a=a+int(each)**2
    num=a
    return num
   
num=input('请输入数字:')
a=num
b=[num]
if num==1:
        result=True
while num!=1:
    num=happynum(num)
    if num in b:
        result=False
        break
    b.append(num)
    if num==1:
        result=True
print(result)
if result==True:
    print('%d是快乐数!'%a)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-8 19:30:11 | 显示全部楼层
def Kuaileshu(shu,n=0):
    shu_next = 0
    for i in str(shu):
        shu_next += int(i)**2
    n += 1
    if shu_next == 1:
        return True
    elif n >= 900:
        return False
    else:
        return Kuaileshu(shu_next,n)


while True:
    a = input("请输入一个数:")
    if Kuaileshu(a):
        print("哈哈," + a + "是一个快乐数")
    else:
        print("遗憾," + a + "不是一个快乐数")
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-18 23:39:49 From FishC Mobile | 显示全部楼层
www
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-9 13:15:40 | 显示全部楼层
已经过时间了,来凑个热闹

  1. def f249(num):
  2.     t = 0
  3.     while num != 1:         
  4.         num = sum(map(lambda x:int(x)**2, str(num)))
  5.         t += 1
  6.         
  7.         if t == 600:break                       
  8.     if num == 1: return True            
  9.     return False
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 04:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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