解题思路:

题目不太好理解。

每次删除的是序列号,最后保留的也是序列号。

按题目案例来说m,n = 30,69

它的意思就是在31~68中有多少个序列号是最后保留下来的序列号。最后保留下来的个数就是幸运数的个数。

那么我们可以先创建一个大小为69的数组B = [i for i in range(n)]

首先我们要将B中下标能整除2的删除del B[2::2]

接着我们要将B中下标能整除B[2]的删除

然后将B中下标能整除B[3]的删除

然后将B中下标能整除B[4]的删除

......

循环终止的条件是B[now] >= len(B)-1

最后检查一下31~38中有几个在B中就可以了。


注意事项:

参考代码:

def f(m,n):
    A = [int(i) for i in range(m+1,n)]
    B = [i for i in range(n)]

    del B[2::2]    #先删除小标能整除2的
    
    now = 2
    while B[now] <= len(B)-1:   #循环终止条件
        del B[B[now]::B[now]]   #删除小标为B[now]的
        now = now+1

    ans = 0
    for item in A:       #检查A中的序列号有几个在B中
        if item in B:
            ans = ans+1
    print(ans)
    
            
if __name__ == '__main__':
    m,n = map(int,input().strip().split())
    f(m,n)


点赞(0)
 

0.0分

6 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论