【python刷题】哈沙德数与幸运数

思路:写一个函数可以便于判断不同进制下的哈沙德数,我们可以先向函数传入两个参数,分别存放一个数字,和一个字符串(由转换该数字的不同进制得到)。由题意,分别把数字转成二进制,八进制,十进制,十六进制,取得的字符串放进该函数中,若这些进制下都为哈沙德数,则将其判定为幸运数。代码如下

def check(n,nstr):
    a=0
    for i in nstr:
        try:
            a+=int(i)
        except:
            a+=ord(i)-ord("a")+10
    if n%a==0:
        return True
    else:
        return False
num=1
t=0
while True:
    b=bin(num)[2:]
    o=oct(num)[2:]
    h=hex(num)[2:]
    if check(num,str(num)) and check(num,b) and check(num,o) and check(num,h):
        t+=1
    if t==2023:
        print(num)
        break
    num+=1

在主程序中,我借助bin(),oct(),hex()是可以得到当前数字num所对应的进制,但是由于他返回的字符串开头两个元素是我们不需要的,所以要切片处理。在自定义的check()函数中,考虑到十六进制数中含有字母,不能直接转为int进行计算,我采用了一个巧妙的方法,就是try语句。遍历数字字符串,try语句先尝试将字符串内当前元素转换成整型然后加给累加器a,若尝试失败,即遇到了字母,就进入下面的except语句,通过ascii码的转换,给他转换成十六进制下对应的数值后再加给a。再来看主程序,我用while写了个死循环,每一轮循环数字num不断增加,而t则是在碰到幸运数后加一,当碰到题中所说的第2023个幸运数时,输出这个数并结束循环。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值