【Python】枚举算法

        枚举算法是什么?来看看百度词条的解释吧!

        枚举算法(也称暴力破解)是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:

(1)可预先确定候选答案的数量;

(2)候选答案的范围在求解之前必须有一个确定的集合。

注:枚举算法一般会用到for循环。


第一题(难度等级:1)

题目描述

在所有三位数中有这么几个数:各位数相加之和是12,请你输出所有满足条件的三位数。

样例输入#1

样例输出#1

129
138
147

……


        解决这个问题,只需要一个for循环,再判断每位数是否相加等于12。for循环取头不取尾,所以应该写成range(100,1000),因为三位数是100(含)~999(含)之间的数。

for i in range(100,1000):   #遍历所有的三位数

        if语句可以先将数字转化为str类型,取每一位数字(取三次,因为是三位数),判断int()后的数字之和是否等于12。

for i in range(100,1000):   #循环遍历所有三位数
    a = int(str(i)[0])   #取百位
    b = int(str(i)[1])   #取十位
    a = int(str(i)[2])   #取个位
    if a + b + c == 12:   #判断三位数每位之和是否等于12

        如果等于12,那么输出这个数。

for i in range(100,1000):   #循环遍历所有三位数
    a = int(str(i)[0])   #取百位
    b = int(str(i)[1])   #取十位
    a = int(str(i)[2])   #取个位
    if a + b + c == 12:   #判断三位数每位之和是否等于12
        print(i)   #输出这个数

         所有代码已讲解完毕,以下为所有代码:

for i in range(100,1000):   #循环遍历所有三位数
    a = int(str(i)[0])   #取百位
    b = int(str(i)[1])   #取十位
    a = int(str(i)[2])   #取个位
    if a + b + c == 12:   #判断三位数每位之和是否等于12
        print(i)   #输出这个数

第二题(难度等级:2)

题目描述

输入一个数n,输出1(含)~n(含)中所有的3的倍数及其个数。

说明/提示

1<n>10000000

样例输入#1

20

样例输出#1

3
6
9

12
15
18
6


        为了统计3的倍数的个数,我们可以先创建一个变量zs,最后再输出zs。

zs = 0   #统计总数变量
print(zs)   #输出总数

        接下来使用for循环(在此之前先输入n),由于0不算是3的倍数, 所以从1开始遍历。

zs = 0   #统计总数变量
n = int(input())   #输入n
for i in range(1,n + 1):   #变量1~n中的所有数
print(zs)   #输出总数

        判断i取余3的得数是否等于0,如果满足,zs加1,并输出i。

zs = 0   #统计总数变量
n = int(input())   #输入n
for i in range(1,n + 1):   #变量1~n中的所有数
    if i % 3 == 0:   #判断是否是3的倍数
        zs += 1   #总数加1
        print(i)   #输出i
print(zs)   #输出总数

        所有代码已讲解完毕,以下为所有代码:

zs = 0   #统计总数变量
n = int(input())   #输入n
for i in range(1,n + 1):   #变量1~n中的所有数
    if i % 3 == 0:   #判断是否是3的倍数
        zs += 1   #总数加1
        print(i)   #输出i
print(zs)   #输出总数

第三题(难度等级:3)

准备操作

创建一个名为lst的列表,并初始值为[7,19,61,83]。

题目描述

用户输入一个数字,输出lst列表中离这个数最近的一个数。

样例输入#1

100

样例输出#1

83


        首先先将列表定义好,再获取输入,并转为int类型。

lst = [7,19,61,83]   #lst列表
num = int(input())   #获取输入

        这个问题的第二步在于遍历列表,而遍历只需要用for i in lst:即可完成。

lst = [7,19,61,83]   #lst列表
num = int(input())   #获取输入
for i in lst:   #遍历列表

        对列表进行遍历以后,我们要来判断i和num之间的关系,避免出现得负数的情况,同时还要将结果用列表n存起来。

lst = [7,19,61,83]   #lst列表
n = []   #存放i-num或num-i的得数
num = int(input())   #获取输入
for i in lst:   #遍历列表
    if num > i:   #判断num是否大于i
    if num < i:   #判断num是否小于i

        那么,当num和i相等时,直接输出i,停止循环。

lst = [7,19,61,83]   #lst列表
n = []   #存放i-num或num-i的得数
num = int(input())   #获取输入
for i in lst:   #遍历列表
    if num > i:   #判断num是否大于i
    if num < i:   #判断num是否小于i
    if num == i:   #判断num是否等于i
        print(i)   #输出i
        break   #跳出循环

        接下来用列表的append()方法将num-i或i-num的结果保存至列表n中。

lst = [7,19,61,83]   #lst列表
n = []   #存放i-num或num-i的得数
num = int(input())   #获取输入
for i in lst:   #遍历列表
    if num > i:   #判断num是否大于i
        n.append(num - i)   #在n里添加num-i的差
    if num < i:   #判断num是否小于i
        n.append(i - num)   #在n里添加i-num的差
    if num == i:   #判断num是否等于i
        print(i)   #输出i
        break   #跳出循环

注:因为我们要计算两数之差,所以要用大的一个数减小的一个数。

        输出时,我们要判断,num减n中的最小值是否在lst里,如果在,就说明num-min(n)等于lst里面里lst列表最近的一个数,反之,则输出num+min(n)。

lst = [7,19,61,83]   #lst列表
n = []   #存放i-num或num-i的得数
num = int(input())   #获取输入
for i in lst:   #遍历列表
    if num > i:   #判断num是否大于i
        n.append(num - i)   #在n里添加num-i的差
    if num < i:   #判断num是否小于i
        n.append(i - num)   #在n里添加i-num的差
    if num == i:   #判断num是否等于i
        print(i)   #输出i
        break   #跳出循环
if num - min(n) in lst:   #判断num减n的最小值是否在lst列表中
    print(num - min(n))   #输出lst中离num最近的数
else:   #反之
    print(num + min(n))   #输出lst中离num最近的数

        但是,这里有一个小问题,如图:

         解决这个问题,只需要用到for-else结构就行了。for-else结构的执行顺序是:

当for循环被完整执行,则启用else中的代码;若for循环中有break,则不执行else中的代码。(continue不影响)

        在判断num是否等于i时,语句块中已经写了“break”关键字,所以执行条件就相当于是num不等于i。

lst = [7,19,61,83]   #lst列表
n = []   #存放i-num或num-i的得数
num = int(input())   #获取输入
for i in lst:   #遍历列表
    if num > i:   #判断num是否大于i
        n.append(num - i)   #在n里添加num-i的差
    if num < i:   #判断num是否小于i
        n.append(i - num)   #在n里添加i-num的差
    if num == i:   #判断num是否等于i
        print(i)   #输出i
        break   #跳出循环
else:   #判断num不等于i
    if num - min(n) in lst:   #判断num减n的最小值是否在lst列表中
        print(num - min(n))   #输出lst中离num最近的数
    else:   #反之
        print(num + min(n))   #输出lst中离num最近的数

         所有代码已讲解完毕,以下为所有代码:

lst = [7,19,61,83]   #lst列表
n = []   #存放i-num或num-i的得数
num = int(input())   #获取输入
for i in lst:   #遍历列表
    if num > i:   #判断num是否大于i
        n.append(num - i)   #在n里添加num-i的差
    if num < i:   #判断num是否小于i
        n.append(i - num)   #在n里添加i-num的差
    if num == i:   #判断num是否等于i
        print(i)   #输出i
        break   #跳出循环
else:   #判断num不等于i
    if num - min(n) in lst:   #判断num减n的最小值是否在lst列表中
        print(num - min(n))   #输出lst中离num最近的数
    else:   #反之
        print(num + min(n))   #输出lst中离num最近的数
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

账号已停更

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值