算法创作 | 将数字变成 0 的操作次数
问题描述给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。为了方便理解题意,下面给出两个示例:示例 1:输入:num = 14输出:6解释:步骤 1) 14 是偶数,除以 2 得到 7 。步骤 2) 7 是奇数,减 1 得到 6 。步骤 3) 6 是偶数,除以 2 得到 3 。步骤 4) 3 是奇数,减 1 得到 2 。步骤 5) 2 是偶数,除以 2 得到 1 。步骤 6) 1 是奇数,减 1 得到 0 。示例 2:输入:num = 8输出:4解释:步骤 1) 8 是偶数,除以 2 得到 4 。步骤 2) 4 是偶数,除以 2 得到 2 。步骤 3) 2 是偶数,除以 2 得到 1 。步骤 4) 1 是奇数,减 1 得到 0 。(来源:力扣)解决方案首先,由题意可知:题目要求给出一个非负整数num,返回将它变成零所需要的次数,并要求当数为偶数时,需要将其除以2,为奇数时,将其减去1。如此重复操作,直到将其变为0,最后返回操作的次数。然后,我们再来找出里面的关键点:首先是num是一个非负整数,所以我们代码不需要对数的类型进行判断,其次是当这个数足够大的时候肯定会经过许多次减去1或者是除以2的操作,那么肯定会用到循环。我们再进一步思考,常用的循环主要有for循环和while循环,那么针对本道题目,选取哪一种循环更好呢?于是我们再进一步思考,for循环一般用于在知道循环次数的情况下,在目标循环次数内进行操作,而while循环一般用于不知道循环次数情况下,在条件范围内循环,满足条件后直接退出循环。可见,对比两种循环后,针对本道题目,选择while循环更合适。最后,在确定循环后,不要着急写代码,题目中还有要求,当该数变成偶数时,需要除以2,为奇数时,需要减去1。所以,在while循环中,我们还需要加入判断语句。这样才能在题目要求范围内完成题目。也许大家现在有一个疑问,for循环是在知道循环次数的情况下进行操作,进而很容易统计循环次数,但while循环是满足条件就跳出循环,要怎样统计循环次数呢?这个问题其实很简单,我们只需要在循环外定义一个初始值为0的变量,然后每循环一次就加1,这样在循环完成后,循环次数也就统计出来啦!下面请看题解代码:def math():num = int(input(''))a = 0while num != 0:if num % 2 == 0:num = num / 2a = a + 1elif num % 2 != 0:num = num - 1a = a + 1return aprint(math())测试结果: