题解 | #挑7#

挑7

https://www.nowcoder.com/practice/ba241b85371c409ea01ac0aa1a8d957b

这题是专门出给执拗狂的题:如果python3 的话其实很简单,用遍历就可以挑出来,条件是
for k in range(1,int(input())): 
    if '7' in str(k) or k%7==0
    count += 1
但是当我写完以后发现用时只超过了20%python用户以后,我就知道有执拗狂使用了自己推导了数学公式的做法:
所以我也试着推了一下:基本思路是,先算整除7的数总和(count1),再算包含7的所有数字的总和(count2),最后计算又包含7又能被7整除的数的总和(count3)
最终结果=count1+count2-count3
比较绕,大家看看就好:
while True:
    try:
        num=int(input())
        #count1比较好算,直接除以7就行
        count1 = num // 7
        bit = len(str(num))
        #count2稍微绕一些,基本思路是,先算个位包含7的数总和,再算十位包含7的数总和(这时候要排除个位上有7的情况),然后是百位(排除个位十位上有7),以此类推直到计算出所有包含7的数的和
        count2 = 0
        for i in range(bit):
            pro= 0
            s='0'
            for j in range(bit - i, bit):
                s = s+str(num)[j]
            for k in range(int(s)+1):
                if not '7' in str(k):
                    pro += 1
         #一个比较难处理的地方是,计算某一位上有7,这一位后面的数有多少个,要分类讨论,这里不做赘述
            if int(str(num)[bit - i - 1]) > 7:
                count2 += (num // (10 ** (i + 1)) + 1) * (9**i)
            elif int(str(num)[bit - i - 1]) == 7:
                count2 += (num // (10 ** (i + 1)) ) * (9 ** i) + pro
            else:
                count2 += max(0,(num // (10 ** (i + 1)))) * (9**i)
        #count3没法用公式算,只能遍历,但是不用每个数都遍历,只要计算7的倍数即可
        count3 = 0
        c = 7
        while c <= num:
            if '7' in str(c):
                count3 += 1
            c += 7
        print(count1 + count2 - count3)
    except:
        break


#逃离互联网#
全部评论

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 15:39
点赞 评论 收藏
分享
06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
07-02 10:44
门头沟学院 C++
码农索隆:太实诚了,告诉hr,你能实习至少6个月
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务