每日一题——Python实现PAT乙级1096 大美数(举一反三+思想解读+逐步优化)3千字好文

news2024/11/18 2:23:46


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

我的写法

时间复杂度分析

空间复杂度分析

总结

哲学和编程思想

1. 抽象与具体化

2. 迭代与递归

3. 分治法

4. 组合数学

5. 优化与效率

6. 模块化与复用

7. 防御性编程

8. 算法复杂度

9. 简洁与清晰

10. 面向对象与函数式编程

总结

举一反三

1. 抽象与模块化

2. 迭代与递归

3. 分治法

4. 组合数学

5. 优化与效率

6. 模块化与复用

7. 防御性编程

8. 算法复杂度

9. 简洁与清晰

10. 面向对象与函数式编程

总结


题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=1478633632938655744&page=0

我的写法

import itertools
import math

def factors(num):
    # 因数包括1和本身
    output = set()
    for i in range(1, int(math.sqrt(num)) + 1):
        if num % i == 0:
            output.add(i)
            output.add(num // i)
    return output

K = int(input())
nums = list(map(int, input().split()))

for num in nums:
    num_factors = factors(num)
    #print(num_factors)
    if len(num_factors) >= 4:
        for combination in itertools.combinations(num_factors, 4):
            # 正整数 N 可以整除它的 4 个不同正因数之和,分清谁是除数被除数
            if sum(combination) %num == 0:
                #print(combination)
                print("Yes")
                break
        else:
            print("No")
    else:
        print("No")

时间复杂度分析

  1. 因数计算函数 factors(num):
    • 该函数的时间复杂度主要由遍历从1到 sqrt(num) 的整数决定,因此是 O(sqrt(num))。
  2. 主程序逻辑:
  • 对于每个正整数 num,计算因数的时间复杂度是 O(sqrt(num))。
  • 如果因数集合的长度大于等于4,则需要生成所有可能的4个因数的组合,并检查每个组合的和是否能被 num 整除。
  • 生成所有4个因数的组合的时间复杂度是 O(C_n^4),其中 n 是因数的数量。由于 n 通常远小于 num,这个复杂度可以近似为 O(n^4)。
  • 因此,对于每个正整数 num,总的时间复杂度是 O(sqrt(num) + n^4)。

空间复杂度分析

  1. 因数计算函数 factors(num):
    • 该函数使用了一个集合来存储因数,因此空间复杂度是 O(sqrt(num))。
  2. 主程序逻辑:
  • 主程序逻辑的空间复杂度主要由存储因数集合 num_factors 决定,因此是 O(sqrt(num))。
  • 此外,生成组合时会占用一些额外的空间,但由于组合的数量通常不会太大,这部分空间复杂度可以忽略不计。

总结

  • 时间复杂度:对于每个正整数 num,总的时间复杂度是 O(sqrt(num) + n^4)。
  • 空间复杂度:总的空间复杂度是 O(sqrt(num))。

这段代码在处理每个正整数时,能够有效地计算因数并检查是否存在满足条件的组合。然而,对于非常大的正整数,生成所有可能的4个因数的组合可能会导致较高的计算成本。


哲学和编程思想

这段代码体现了以下哲学和编程思想:

1. 抽象与具体化

  • 抽象:代码通过定义函数 factors(num) 来抽象出计算一个数的所有因数的过程。这种抽象使得代码更模块化,便于理解和维护。
  • 具体化:在主程序中,通过调用 factors(num) 函数并结合具体逻辑(如组合生成和条件判断)来解决具体问题。

2. 迭代与递归

  • 迭代:代码中使用 for 循环来遍历因数和组合,这是一种迭代思想。迭代通常比递归更直观且效率更高。

3. 分治法

  • 分治法:代码通过将问题分解为两个子问题:计算因数和检查组合。这种分治法使得问题更易于管理和解决。

4. 组合数学

  • 组合数学:代码使用 itertools.combinations 来生成所有可能的4个因数的组合。这体现了组合数学中的组合生成思想。

5. 优化与效率

  • 优化:代码在生成组合时,一旦找到满足条件的组合就立即返回结果,避免了不必要的计算,这是一种优化思想。
  • 效率:通过使用集合 set 来存储因数,避免了重复因数,提高了效率。

6. 模块化与复用

  • 模块化:代码通过定义独立的函数 factors(num),使得计算因数的过程可以被复用,体现了模块化编程思想。
  • 复用:主程序中多次调用 factors(num) 函数,体现了代码复用的原则。

7. 防御性编程

  • 防御性编程:代码在检查因数数量时,先判断因数数量是否大于等于4,这是一种防御性编程思想,确保程序在处理边界情况时不会出错。

8. 算法复杂度

  • 算法复杂度:代码在计算因数时,通过遍历到 sqrt(num) 来减少计算量,体现了对算法复杂度的考虑。

9. 简洁与清晰

  • 简洁:代码通过使用 itertools.combinations 和集合操作,使得代码简洁且易于理解。
  • 清晰:代码结构清晰,逻辑明确,易于阅读和维护。

10. 面向对象与函数式编程

  • 函数式编程:代码主要采用函数式编程风格,通过定义函数和使用高阶函数(如 itertools.combinations)来解决问题。
  • 面向对象:虽然代码主要采用函数式编程风格,但也可以通过将函数封装到类中来实现面向对象编程。

总结

这段代码体现了抽象与具体化、迭代与递归、分治法、组合数学、优化与效率、模块化与复用、防御性编程、算法复杂度、简洁与清晰以及函数式编程等多种哲学和编程思想。这些思想共同构成了代码的设计和实现基础。


举一反三

根据上述哲学和编程思想,以下是一些技巧,可以帮助你举一反三,更好地解决类似问题:

1. 抽象与模块化

  • 抽象化问题:将复杂问题分解为更小的、可管理的部分。例如,将计算因数的功能抽象为一个独立的函数。
  • 模块化设计:确保每个函数或模块只做一件事,并且做得好。这样可以使代码更易于测试、维护和复用。

2. 迭代与递归

  • 选择合适的循环结构:根据问题的性质选择使用 for 循环或 while 循环。通常,已知迭代次数时使用 for 循环,未知次数时使用 while 循环。
  • 递归思维:对于可以自然分解为更小子问题的问题,考虑使用递归。但要注意递归的深度和效率。

3. 分治法

  • 分解问题:将大问题分解为多个小问题,分别解决每个小问题,然后将结果合并。这有助于简化复杂问题的解决过程。

4. 组合数学

  • 利用组合工具:使用 itertools 库中的组合生成工具(如 combinations 和 permutations)来处理需要生成组合或排列的问题。

5. 优化与效率

  • 提前终止:在找到满足条件的解后立即返回,避免不必要的计算。
  • 选择合适的数据结构:根据问题的需求选择合适的数据结构,如使用集合 set 来避免重复元素。

6. 模块化与复用

  • 代码复用:设计可复用的函数和模块,避免重复代码。
  • 库的使用:利用现有的库和工具,如 math 和 itertools,来提高开发效率。

7. 防御性编程

  • 边界检查:在处理输入数据时,进行必要的边界检查,确保程序在异常情况下也能正常运行。
  • 错误处理:使用异常处理机制来捕获和处理可能的错误。

8. 算法复杂度

  • 选择合适的算法:根据问题的规模和性质选择合适的算法,考虑时间复杂度和空间复杂度。
  • 优化算法:对算法进行优化,减少不必要的计算和存储。

9. 简洁与清晰

  • 代码风格:保持代码风格一致,使用有意义的变量名和函数名,使代码易于理解。
  • 注释和文档:添加必要的注释和文档,帮助他人理解代码。

10. 面向对象与函数式编程

  • 选择编程范式:根据问题的性质选择合适的编程范式。函数式编程适合处理数据转换和计算密集型任务,而面向对象编程适合处理复杂的数据结构和对象交互。
  • 混合使用:在必要时,可以将函数式编程和面向对象编程结合起来,发挥各自的优势。

总结

通过运用这些技巧,可以更好地理解和解决类似问题,提高编程能力和代码质量。不断实践和总结经验,将有助于在编程道路上不断进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024亚太杯中文赛B题洪水灾害的数据分析与预测原创论文分享

大家好,从昨天肝到现在,终于完成了2024年第十四届 APMCM 亚太地区大学生数学建模竞赛B题洪水灾害的数据分析与预测的完整论文啦。 实在精力有限,具体的讲解大家可以去讲解视频: 2024亚太杯中文赛B题洪水灾害预测原创论文保姆级教…

Ad-hoc命令和模块简介

华子目录 Ad-hoc命令和模块简介1.概念2.格式3.Ansible命令常用参数4.模块类型4.1 三种模块类型4.2Ansible核心模块和附加模块 示例1示例2 Ad-hoc命令和模块简介 1.概念 Ansible提供两种方式去完成任务,一是ad-hoc命令,一是写Ansible playbook(剧本)Ad-…

uni-app打包小程序的一些趣事~

前言 Huilderx版本&#xff1a;4.15 uni-app Web端版本&#xff1a;3.4.21 问题1 Web端/APP端样式好好的&#xff0c;打包微信小程序就乱了咋整&#xff1f; 使用::v-deep/::deep/deep(){}都是没用滴~~ 原因&#xff1f; 解决&#xff1a; <script lang"ts"…

2024/7/6 英语每日一段

More than half of late-teens are specifically calling for more youth work that offers “fun”, with older teenagers particularly hankering for more jollity, according to a study carried out by the National Youth Agency. One in 10 said they have zero option…

将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置

我们倾向于将IConfiguration对象转换成一个具体的对象&#xff0c;以面向对象的方式来使用配置&#xff0c;我们将这个转换过程称为配置绑定。除了将配置树叶子节点配置节的绑定为某种标量对象外&#xff0c;我们还可以直接将一个配置节绑定为一个具有对应结构的符合对象。除此…

C语言课程回顾:八、C语言之函 数

C语言之函 数 8 函 数8.1 概述8.2 函数定义的一般形式8.3 函数的参数和函数的值8.3.1 形式参数和实际参数8.3.2 函数的返回值 8.4 函数的调用8.4.1 函数调用的一般形式8.4.2 函数调用的方式8.4.3 被调用函数的声明和函数原型 8.5 函数的嵌套调用8.6 函数的递归调用8.7 数组作为…

大厂面试官问我:MySQL宕机重启了,怎么知道哪些事务是需要回滚的哪些是需要提交的?【后端八股文九:Mysql事务八股文合集】

本文为【Mysql事务八股文合集】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ 大家第一眼看到这个标题&#xff0c;不知道心中是否有答案了&#xff1f;在面试当中&#xff0c;面试官经常对项目亮点进行深挖&#xff0c;来考察你对这个项目亮点的理解以及…

AIGC | 为机器学习工作站安装NVIDIA 4070 Ti Super显卡驱动

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言简述 话接上篇《AIGC | Ubuntu24.04桌面版安装后必要配置》文章&#xff0c;作为作者进行机器学习的基础篇&#xff08;筑基期&#xff09;&#xff0c;后续将主要介绍机器学习环境之如何…

32位Arm嵌入式开发Ubuntu环境设置

32位Arm嵌入式开发Ubuntu环境设置 今天在调试一块32位ARM A7开发板时老是不成功&#xff0c;我装的是Ubuntu22.04版&#xff0c;在终端下运行工具链里的gdb程序居然报了一大堆错误&#xff0c;缺这个缺那个&#xff0c;按照提示装了一遍&#xff0c;再运行发现需要Python2.7环境…

NSK发布新版在线计算工具

July 01, 2024 NSK Ltd. Corporate Communications Department NSK Ltd. announced today that it has improved the engineering tools available on its website. The new engineering tools — NSK Online Catalog, Technical Calculations, and 2D/3D CAD Data — which …

STM32第十五课:LCD屏幕及应用

文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间&#xff0c;温度&#xff0c;湿度。 一、LCD显示屏 液晶显示器&#xff0c;简称 LCD(Liquid Cry…

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列 1.相关链接2.代码【仅分析带通信算子的Pattern】3.在实际工程中发现 [all_gather, matrix_mm_out]频率最高4.[Ascend MC2](https://gitee.com/ascend/MindSpeed/blob/master/docs/features…

路径规划之基于二次规划的路径平滑Matlab代码

参考&#xff1a; 自动驾驶决策规划算法第二章第二节(上) 参考线模块_哔哩哔哩_bilibili 自动驾驶决策规划算法第二章第二节(下) 参考线代码实践_哔哩哔哩_bilibili QP函数&#xff0c;二次规划的逻辑 function [smooth_path_x,smooth_path_y] QP(path_x, path_y, w_cost_s…

docker也能提权??内网学习第6天 rsync未授权访问覆盖 sudo(cve-2021-3156)漏洞提权 polkit漏洞利用

现在我们来说说liunx提权的操作&#xff1a;前面我们说了环境变量&#xff0c;定时任务来进行提权的操作 rsync未授权访问覆盖 我们先来说说什么是rsync rsync是数据备份工具&#xff0c;默认是开启的873端口 我们在进行远程连接的时候&#xff0c;如果它没有让我们输入账号…

从海上长城到数字防线:视频技术在海域边防现代化中的创新应用

随着全球化和科技发展的加速&#xff0c;海域安全问题日益凸显其重要性。海域边防作为国家安全的第一道防线&#xff0c;其监控和管理面临着诸多挑战。近年来&#xff0c;视频技术的快速发展为海域边防场景提供了新的解决方案&#xff0c;其高效、实时、远程的监控特点极大地提…

【优化论】基本概念与细节

优化论&#xff08;Optimization Theory&#xff09;是数学和计算机科学中一个重要的分支&#xff0c;旨在寻找给定问题的最优解。这个领域的应用非常广泛&#xff0c;从经济学、工程学到机器学习、金融等各个领域都有其踪迹。我们可以通过一系列直观的比喻来理解优化论的基本概…

数据库之SQL(二)

目录 一、简述SQL中如何将“行”转换为“列” 二、简述SQL注入 三、如何将一张表的部分数据更新到另一张表 四、WHERE和HAVING的区别 一、简述SQL中如何将“行”转换为“列” 我们以MySQL数据库为例&#xff0c;来说明行转列的实现方式。 首先&#xff0c;假设我们有一张分…

2024亚太杯中文赛数学建模B题完整论文讲解(含每一问python代码+结果+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题洪水灾害的数据分析与预测完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人…

【JavaWeb程序设计】JSP编程II

目录 一、输入并运行下面的import_test.jsp页面 1.1 代码运行结果 1.2 修改编码之后的运行结果 二、errorPage属性和isErrorPage属性的使用 2.1 下面的hello.jsp页面执行时将抛出一个异常&#xff0c;它指定了错误处理页面为errorHandler.jsp。 2.1.2 运行截图 2.2 下面…

罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式

1、const 1&#xff09;、常量 const一般的用法就是修饰变量、引用、指针&#xff0c;修饰之后它们就变成了常量&#xff0c;需要注意的是const并未区分出编译期常量和运行期常量&#xff0c;并且const只保证了运行时不直接被修改 一般的情况&#xff0c;const放在左边&…