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


一个认为一切根源都是“自己不够强”的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.mfbz.cn/a/761431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

svn切换分支

现在有一个场景: 在svn中有一个b分支,是基于a分支拉出来的,并且我的b分支在本地已经有了改动,a分支在远端也有了改动, 我想把远端a分支的改动同步到我的本地b分支上,如何操作 目前已知的方法 项目右键-&g…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-49风格迁移

49风格迁移 读入内容图像: import torch import torchvision from torch import nn import matplotlib.pylab as plt import liliPytorch as lp from d2l import torch as d2l# 读取内容图像 content_img d2l.Image.open(../limuPytorch/images/rainier.jpg) plt.…

J019_选择排序

一、排序算法 排序过程和排序原理如下图所示&#xff1a; 二、代码实现 package com.itheima.sort;import java.util.Arrays;public class SelectSort {public static void main(String[] args) {int[] arr {5, 4, 3, 1, 2};//选择排序for (int i 0; i < arr.length - 1…

django西餐厅管理系统-计算机毕业设计源码10873

摘要 在现代餐饮行业中&#xff0c;高效的管理系统对于西餐厅的成功运营至关重要。为了满足西餐厅日益增长的管理需求&#xff0c;设计并实现了一款基于 Python 的西餐厅管理系统。 Python作为一种简洁而易读的编程语言&#xff0c;具有广泛的应用领域&#xff0c;包括Web开发。…

MySQL5.7安装初始化错误解决方案

问题背景 今天在给公司配数据库环境时,第一次报initializing database 数据库初始化错误? 起初没管以为是安装软件原因,然后就出现以下错误:如下图 点开log,我们观察日志会发现 无法识别的参数 ‘mysqlx_port=0.0’,???,官方的安装程序还能出这问题?

docker的安装与基本使用

一.docker的安装卸载 1.先安装所需软件包 yum install -y yum-utils2.设置stable镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.安装DOCKER CE yum -y install docker-ce docker-ce-cli containerd.io 4.验…

【SpringCloud】Eureka源码解析 上

Eureka是一个服务发现与注册组件&#xff0c;它包含服务端和客户端&#xff0c;服务端管理服务的注册信息&#xff0c;客户端简化服务实例与服务端的交互。我们结合源码来分析下eureka组件的实现原理&#xff0c;内容分为上下两章&#xff0c;第一章分析eureka的服务注册&#…

【每日一练】python if选择判断结构应用

应用类 1. 计算面积 编写一个Python程序&#xff0c;计算矩形的面积。要求用户输入矩形的宽和高&#xff0c;然后计算并打印面积。 width float(input("请输入矩形的宽&#xff1a;")) height float(input("请输入矩形的高&#xff1a;")) if width &…

《数字图像处理与机器视觉》案例三 (基于数字图像处理的物料堆积角快速测量)

一、前言 物料堆积角是反映物料特性的重要参数&#xff0c;传统的测量方法将物料自然堆积&#xff0c;测量物料形成的圆锥表面与水平面的夹角即可&#xff0c;该方法检测效率低。随着数字成像设备的推广和应用&#xff0c;应用数字图像处理可以更准确更迅速地进行堆积角测量。 …

Visual Studio 设置回车代码补全

工具 -> 选项 -> 文本编辑器 -> C/C -> 高级 -> 主动提交成员列表 设置为TRUE

萨科微slkor金航标kinghelm的品牌海外布局

萨科微slkor&#xff08;www.slkormicro.com&#xff09;金航标kinghelm宋仕强在介绍品牌的海外布局时说&#xff0c; 萨科微目前在土耳其、印度、新加坡均有代理商&#xff0c;海外代理商还在不断的发展和筛选中&#xff01;欢迎公司有资质&#xff0c;在当地有一定客户关系的…

Axure 中继器 实现选取表格行、列交互

Axure 中继器 实现选取表格行、列交互 引言 在办公软件或富文本编辑器中插入表格的时候我们经常可以通过在表格上移动鼠标&#xff0c;可以选取想要插入的表格行、列数。 本文分享如何通过 Axure 实现这个交互。 放入中继器 这个交互的用到了中继器&#xff0c;所以首先在…

WPF/C#:BusinessLayerValidation

BusinessLayerValidation介绍 BusinessLayerValidation&#xff0c;即业务层验证&#xff0c;是指在软件应用程序的业务逻辑层&#xff08;Business Layer&#xff09;中执行的验证过程。业务逻辑层是应用程序架构中的一个关键部分&#xff0c;负责处理与业务规则和逻辑相关的…

【C++】继承(详解)

前言&#xff1a;今天我们正式的步入C进阶内容的学习了&#xff0c;当然了既然是进阶意味着学习难度的不断提升&#xff0c;各位一起努力呐。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &#x1f448; &#…

2065. 最大化一张图中的路径价值 Hard

给你一张 无向 图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff08;都包括&#xff09;。同时给你一个下标从 0 开始的整数数组 values &#xff0c;其中 values[i] 是第 i 个节点的 价值 。同时给你一个下标从 0 开始的二维整数数组 edges &#xf…

电子技术基础(模电部分)笔记

终于整理出来了&#xff0c;可以安心复习大物线代了&#xff01;&#xff01; 数电部分预计7.10出

007-GeoGebra基础篇-构建等边三角形

今天继续来一篇尺规作图&#xff0c;可以跟着操作一波&#xff0c;刚开始我写的比较细一点&#xff0c;每步都有截图&#xff0c;后续内容逐渐复杂后我就只放置算式咯。 目录 一、先看看一下最终效果二、本次涉及的内容三、开始尺规画图1. 绘制定点A和B2. 绘制线段AB3. 以点A为…

【日记】度过了一个堕落的周末……(184 字)

正文 昨天睡了一天觉&#xff0c;今天看了一天《三体》电视剧。真是堕落到没边了呢&#xff08;笑。本来想写代码完成年度计划&#xff0c;或者多写几篇文章&#xff0c;但实在不想写&#xff0c;也不想动笔。 感觉这个周末什么都没做呢&#xff0c;休息倒是休息好了。 今天 30…

基于x86/ARM+FPGA+AI工业相机的智能工艺缺陷检测,可以检测点状,线状,面状的缺陷

应用场景 缺陷检测 在产品的制造生产环节中发挥着极其重要作用。智能工业缺陷检测能够替代传统的人工检测&#xff0c;降低人为判断漏失&#xff0c;使得产品质量大幅提升的同时降低了工厂的人力成本。智能工艺缺陷检测技术可以检测点状&#xff0c;线状&#xff0c;面状的缺陷…

UnityUGUI之四 Mask

会将上级物体遮盖 注&#xff1a; 尽量不使用Mask&#xff0c;因为其会过度消耗运行资源&#xff0c;可以使用Rect 2DMask&#xff0c;但容易造成bug&#xff0c;因此最好实现遮罩效果的方式为自己写一个mask物体