当前位置: 首页 > article >正文

蓝桥杯模拟题--约数的个数(约数和质因数的区别)

1.求一个数的约数及其个数

约数:约数是指能够整除一个整数的数。如果整数a除以整数的商正好是整数而没有余数,我们就说b是a的约数。例如,6可以被1,2,3,4整除,所以1、2、3、6都是6的约数。

用代码实现十分简单,只需一个for循环即可

# 以12为例
n=12
li=[]
for i in range(1,n+1):
    if n%i==0:
        li.append(i)
print(li)
print(len(li))

# [1, 2, 3, 4, 6, 12]
# 6

2.求一个数的质因数及其个数

质因数:质因数是指一个数的因数中,既是质数又是因数的数。也就是说,质因数是在约数的基础上,进一步限定为质数。例如,6=2*3,其中2和3是质数,所以2和3是6的质因数。

a=12
i=2
lis=[]
while i*i<=a:  # 减少不必要的判断
    while a%i==0: 
        lis.append(i)
        a//=i
    i+=1
if a>1:
    lis.append(a)
print(lis)
print(len(lis))

# [2, 2, 3]
# 3

3.蓝桥杯模拟题

测试数据如下:

393353 901440 123481 850930 423154 240461
373746 232926 396677 486579 744860 468782
941389 777714 992588 343292 385198 876426
483857 241899 544851 647930 772403 109929
882745 372491 877710 340000 659788 658675
296521 491295 609764 718967 842000 670302

 3.1 方法一

利用for循环依次遍历,代码简单,十分容易理解,但是面对众多数据时耗时长

nums, mx, key = [list(map(int, input().split())) for _ in range(6)], 0, 0

def g(n):
    li=[]
    for i in range(1,n+1):
        if n%i==0:
            li.append(i)
    return len(li)
for i in range(6):
    for j in range(6):
        ans=g(nums[i][j])
        if ans>mx:
            mx,key=ans,nums[i][j]
print(key)

# 901440

3.2 方法二

运用约数个数定理,显著提高程序运行速度,但不易理解

约数个数定理:约数个数等于不同的质因数的次数加一的累乘

nums, mx, key = [list(map(int, input().split())) for _ in range(6)], 0, 0

def f(n):
    i=2
    res=1
    while i*i<=n:
        c=1   # 因为是次数加1的累乘,首先定义次数为1
        while n%i==0:
            n=n//i
            c+=1  # 每得出一个质因数,其次数加1
        i += 1
        res*=c    # 次数加1的累乘

    if n>1:       # 若最后的数>1
        res*=2    # 其次数加1必为2
    return res

for i in range(6):
    for j in range(6):
        ans=f(nums[i][j])
        if ans>mx:
            mx,key=ans,nums[i][j]
print(key)

3.3 两种方法耗时对比

import time
nums, mx, key = [list(map(int, input().split())) for _ in range(6)], 0, 0
start1=time.time()
def g(n):
    li=[]
    for i in range(1,n+1):
        if n%i==0:
            li.append(i)
    return len(li)
for i in range(6):
    for j in range(6):
        ans=g(nums[i][j])
        if ans>mx:
            mx,key=ans,nums[i][j]
print(key)
end1=time.time()
print(f"方法一所用的时间{end1-start1}秒")

nums, mx, key = [list(map(int, input().split())) for _ in range(6)], 0, 0
start2=time.time()
def f(n):
    i=2
    res=1
    while i*i<=n:
        c=1
        while n%i==0:
            n=n//i
            c+=1
        i += 1
        res*=c
    if n>1:
        res*=2
    return res
for i in range(6):
    for j in range(6):
        ans=f(nums[i][j])
        if ans>mx:
            mx,key=ans,nums[i][j]
print(key)
end2=time.time()
print(f"方法二所用的时间{end2-start2}秒")



# 393353 901440 123481 850930 423154 240461
# 373746 232926 396677 486579 744860 468782
# 941389 777714 992588 343292 385198 876426
# 483857 241899 544851 647930 772403 109929
# 882745 372491 877710 340000 659788 658675
# 296521 491295 609764 718967 842000 670302
# 901440
# 方法一所用的时间0.5132265090942383秒
# 393353 901440 123481 850930 423154 240461
# 373746 232926 396677 486579 744860 468782
# 941389 777714 992588 343292 385198 876426
# 483857 241899 544851 647930 772403 109929
# 882745 372491 877710 340000 659788 658675
# 296521 491295 609764 718967 842000 670302
# 901440
# 方法二所用的时间0.0009989738464355469秒

明显看出方法一需要大约0.5秒,方法二只需要0.001秒,当面对更多的数据时,方法一耗时会更长


http://www.kler.cn/a/612311.html

相关文章:

  • spring-ai ollama小试牛刀
  • DaemonSet 与 Deployment 的主要区别
  • VSCode 抽风之 两个conda环境同时在被激活
  • 数字图像处理 -- 霍夫曼编码(无损压缩)练习
  • 解决electron-builder vue 打包后element-ui字体图标不显示问题
  • Redis之缓存双写一致性理论分析
  • 数字孪生技术:重塑UI前端的未来
  • C++实现Nadaraya - Watson 核回归计算难题实录:从 O (n²) 到高效优化
  • MybatisPlus(SpringBoot版)学习第四讲:常用注解
  • 【MLP-BEV(10)】BEVPooling V1和BEVPooling V2的view_transformer,进行鱼眼图片实践
  • Android Token的原理和本地安全存储
  • 智能遥感新质生产力暨DeepSeek、Python、OpenCV驱动的空天地数据识别与计算及15个行业标杆案例
  • 代码随想录算法训练营第五十八天 | 拓扑排序精讲 dijkstra(朴素版)精讲
  • css 实现闪烁光标
  • 一套SaaS多租户医疗云his源码,基于云计算的医院信息管理系统(云HIS)
  • Ribbon负载均衡的深度解析与应用
  • 【数学建模】动态规划算法(Dynamic Programming,简称DP)详解与应用
  • 金融级密码管理器——生物特征密钥绑定方案
  • docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库
  • SSRF服务器请求伪造攻击