常用算法——枚举算法

这篇具有很好参考价值的文章主要介绍了常用算法——枚举算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举算法

一、基本概念和算法

    枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体体现,又称为蛮力法。

    枚举法的基本思想是:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。

  • 枚举的意义

1) 可以充分利用计算机的速度,解决一些常见问题

2) 如果问题的规模不大,使用枚举,运算速度是可以接收的。

3) 枚举可作为某类问题时间性能的底线,用来引出同样问题的更高效率的算法。

  • 枚举的实施步骤(算法)

1) 根据问题的具体情况确定枚举量(简单变量或数组)

2) 根据问题的具体清空确定枚举范围,设置枚举循环

3) 根据问题的具体要求确定筛选(约束)条件

4) 设计枚举程序并运行、调试,对运行结果进行分析与讨论。

二、判断阿姆斯特朗数

    例1 求三到十位的“阿姆斯特朗数”。

    所谓“阿姆斯特朗数”是指一个三位数及以上的数,其各位数字的位数次方和等于其本身。例如:153是一个阿姆斯特朗数,因为

    枚举算法,算法,开发语言,python,经验分享

    472335975是一个阿姆斯特朗数,因为

    枚举算法,算法,开发语言,python,经验分享

    其中不同位数的阿姆斯特朗数也有别名,如三位的阿姆斯特朗数也叫“水仙花数”,七位的阿姆斯特朗数也叫“北斗七星数”等。

    那么这道题的取值范围即100-10000000000(,不含),条件限制为各位数字的位数次方和等于其本身。

    如何取各位数字

    可用整除、取余获取各位数字,但位数不定不好处理,故可以转化为字符串,求长度(次方数),取字符串元数(每一位数)。

    数值转为字符串的语法格式为:

str(数值表达式)

    转换后,正数不含符号位,字符串为序列,每个字符为元素。

    f格式化字符串:f-string采用{content:format}设置字符串格式,其中content是替换并填入字符串的内容,可以是变量、表达式或函数等,format是格式描述符。采用默认格式时不必指定 “:format”。其语法格式为:

f'{字符串/变量:格式}'

其中:大括号前、后:可以放任何字符串,它们将直接显示在结果中;大括号内:目标字符串+目标格式;冒号前:需要格式化的原始字符串或变量,冒号后:需要的目标格式(缺省用默认格式)

完整程序如下:

for i in range(100,10**10):  # 不含10**10,终值为9999999999
    s = 0                # 求和初值取“0”
    n = len(str(i))      # 获取数值i的位数
    for j in str(i):     # str(123)='123',则j='1','2','3'
        s += int(j) ** n # 求各位数的n次方和
    if s == i:           # n位阿姆斯特朗数的判断条件
        print(f'{n}位阿姆斯特朗数:', i)

执行结果:

枚举算法,算法,开发语言,python,经验分享

    此程序虽然简单,但输出效果不是很理想,同样位数的阿姆斯特朗数没有显示在同一行中。此程序涉及100亿次的10位100亿次方数和运算,所以会耗费数小时(7位前耗时数秒,8位前耗时1~2分,9位前耗时数10~30分)

    下面对程序进行改进,将不同位数的阿姆斯特朗数标上“别名”,并将相同位数的阿姆斯特朗数显示在同一行中,但耗时基本不变。下面的程序中用到了三元表达式。

    三元表达式又称三元运算符,Python中三元表达式的语法格式为:

表达式1 if 条件表达式 else 表达式2

    当“条件表达式”为True时,返回结果为“表达式1”,否则返回结果为“表达式2”。

    获取字典“键”的列表的语法格式为:

list(字典.keys())

    完整程序如下:

ArmstrongNum = {'三':'水仙花','四':'四叶玫瑰','五':'五角星','六':'六合',
            '七':'北斗七星','八':'八仙','九':'九九重阳','十':'十全十美'}
for i in range(2,10):
    print(f'{list(ArmstrongNum.keys())[i-2]}位的'
          f'{ArmstrongNum[list(ArmstrongNum.keys())[i-2]]}数:', end='')
    m = 0
    for j in range(10**i, 10**(i+1)):	# 1后跟i个0到 i+1个9
        n = len(str(j))					# n = i + 1,数值j的位数
        s = 0
        for k in str(j):				# str(123)='123',k='1','2','3'
            s += int(k) ** n			# 求各位的n次方和
        if s == j:						# n位阿姆斯特朗数的判断条件
            print(j if m==0 else f', {j}', end='')
            m += 1
    print()

执行结果:

枚举算法,算法,开发语言,python,经验分享

三、解百鸡问题

    我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱百鸡,问鸡翁鸡母鸡雏各几何?

    例2 百鸡问题:(白话文翻译)有一个人有一百个钱,打算买一百只鸡。到市场一看,公鸡五个钱一只,母鸡三个钱一只,小鸡一个钱三只,怎么样买法,才能刚好用一百个钱买一百只鸡?。现在,请你编一程序,帮他计划一下。

    注意:鸡都是整只的,钱总数也是整数。因为买公鸡和母鸡花费的钱为整数,所以买小鸡的钱也必须是整数,因此小鸡数为3的倍数。

    设公鸡数为rooster,母鸡数为hen,则小鸡数为

chicken = 100-rooster-hen

    一百个钱最多买20只公鸡,一百个钱最多买33只母鸡。具体程序代码如下:

for rooster in range(21):			# 公鸡0~20,不包含21
    for hen in range(34):			# 母鸡0~33,不包含34
        chicken = 100-rooster-hen	# 求小鸡数
        if rooster * 5 + hen * 3 + chicken/3 == 100:
            print(f'公鸡{rooster}只+母鸡{hen}只+小鸡{chicken}只=100只鸡。')

输出结果为:

枚举算法,算法,开发语言,python,经验分享 

程序优化:

    思路:设公鸡数为x,母鸡数为y,小鸡数为z,则

    枚举算法,算法,开发语言,python,经验分享

    两方程三变量,不能直接求解,属不定方程

    程序每使用一个for(x)循环,就相当于将一个未知数(x)变成已知数(x), 两个方程两个未知数,方程就具有可解性了,这样就可以, 继续减少一个循环的嵌套。则解方程①②得

    枚举算法,算法,开发语言,python,经验分享

可用一个循环求解问题。

for x in range(21):							# 0~20,不包含21。公鸡数不会超过20
    y = int(25-7*x/4) if 25 >= 7*x/4 else 0	# 先求y(母鸡数为整数且大于等于0)
    z = 100-x-y								# 再求z
    if x * 5 + y * 3 + z / 3 == 100:
        print(f'公鸡{x}只+母鸡{y}只+小鸡{z}只=100只鸡。')

输出结果为:

枚举算法,算法,开发语言,python,经验分享文章来源地址https://www.toymoban.com/news/detail-840523.html

到了这里,关于常用算法——枚举算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【经验分享】自然语言处理技术有哪些局限性和挑战?

    个人认为,主要是两个难点: 1.语料,通常的语料很好解决,用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的,例如:航天材料、电气设备、地理信息、化学试剂 等等。往往很多素材和语料都是很宝贵的,而且都是这些企业的内

    2024年02月21日
    浏览(38)
  • 面试经验分享 | 某康安全开发工程师

    DOM型xss和别的xss最大的区别就是它不经过服务器,仅仅是通过网页本身的JavaScript进行渲染触发的。 平常用的多的是MySQL数据库,像Oracle数据库也有了解,但是用的不多。 我的研究方向是自然语言处理,具体的领域是虚假信息检测。我的小论文中采用的数据集是twitter15和twit

    2024年04月15日
    浏览(52)
  • 使用Unity开发手机AR项目经验分享

           AR技术发展到现在也不新鲜了,开发AR的SDK也是五花八门,怎么选择是个问题。这篇文章提供了一套整体开发AR思路,还有后续兼容性问题的解决思路。         Unity开发手机AR项目主要是集成的ARCore和ARKit,ARCore面向Android手机而ARKit面向IOS,从Unity2019后Unity官方使用

    2024年02月11日
    浏览(43)
  • 我的ESP-01S开发历程与经验分享

    一、总体说明 本人是个外行,没事搞一下单片机纯属业余爱好而已。学习历程为51——Arduino——NodeMcu_ESP-8266——STM32。做过几样东西,倒是觉得很有趣,也便有了继续学习下去的动力。ESP系列是入门级和业余爱好者开发物联网的不二之选。ESP-01S小开发板对于做简单的物联网

    2023年04月27日
    浏览(37)
  • SuperPoint和SuperGlue 的算法介绍及学习应用经验分享

    特征点提取和匹配是多视图几何的基础理论知识,在SLAM相关领域有着重要作用。比如在视觉SLAM中,著名ORBSLAM就是基于特征点法的,一般通过特征点提取和匹配,再根据匹配关系进行几何求解就可以得到位姿。 一般流程为 1.输入一对图像 2.提取特征点 3.进行匹配 4.根据匹配关

    2024年01月19日
    浏览(36)
  • 【STM32】-串口开发经验分享-基于RTOS+空闲中断

    目录 1. 概述     2.串口介绍 2.1 原理框图 2.2 RS-232C 2.3 RS-422 2.4 RS-485 2.5 UART 3. STM32 USART介绍 4. CubeMx生成Uart初始化代码 4.1 NewProject选择单片机型号 4.2 设置rcc时钟  4.3 设置Usart 4.4 初始化代码 4.5 注意 5 工程源码解析 5.1 程序架构 5.2 源码 fml_ring_buffer.c fml_usart.c app_usart_task.c stm3

    2023年04月16日
    浏览(42)
  • 数据可视化大屏——基于echarts的开发经验分享

    各位同事大家好!下面是我使用echarts中总结的一些个人经验,仅供参考。 echarts的能力、优劣等特点大家应该在技术选型阶段已经有所了解,这里主要分享使用、设计等经验。 echarts由无到有一共只需要四步: 引入echarts资源 :支持模块化项目使用npm下载引入,老项目使用s

    2024年02月01日
    浏览(54)
  • 蓝桥杯-单片机设计与开发组-(1)经验分享

            首先,我先自我介绍一下,本人是一名大二小菜。在2023年十四届蓝桥杯中获得了省级二等奖,虽然谈不上优秀,不过在备赛过程中也有了自已的一套心得与看法,在两个月备赛过程中,我已经把16年到22真题全部独立完成了。因此,有了一个想法想要在CSDN分享一下

    2024年02月05日
    浏览(38)
  • 某手机大厂安卓framework开发面试机试经验分享

    hi,粉丝朋友们: 大家好!刚好现在处于一个金三银四的时间,很多同学都希望找个好的工作,这边刚好也有相关同学近期拿到了某手机大厂,具体啥大厂这里就不透露了,哈哈大家也很容易知道,需要机试的手机厂商就一两个,不给自己找麻烦,文章里面统一用某手机大厂

    2024年04月25日
    浏览(27)
  • uni-app开发小程序:项目架构以及经验分享

    2022年的时候,公司为了快速完成产品并上线,所以选用微信小程序为载体;由于后期还是打算开发App;虽然公司有ios和Android,但是如果能一套代码打包多端,一定程度上可以解决成本;前端技术栈也是vue,在考察选择了uni-app。后来多个小程序项目都采用了uni-app开发,积累了

    2024年02月09日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包