枚举算法是什么?来看看百度词条的解释吧!
枚举算法(也称暴力破解)是我们在日常中使用到的最多的一个算法,它的核心思想就是:枚举所有的可能。枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:
(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
912
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最近的数