愿此后再无WA:全心备战蓝桥杯,博客文章质量或将下降

想说

愿此后再无WA:全心备战蓝桥杯,博客文章质量或将下降

大家好,我叫@愿不了WA,你们可以叫我小A,也可以叫我圆圆,一个阳光帅气的小伙子,对算法领域比较感兴趣。如果我的文章对您有用,请继续关注,让我们共同进步!

对不起大家,现在距离蓝桥杯比赛还有不到一个月的时间了,我暂时改变了计划,转而全力备战蓝桥比赛,因为这个省对我来说太重要了,也我最后的机会。如果你想得到的话,我肯定会少花很多时间在博客上,而且也会导致博文质量明显下降。我想向大家道歉。

这些天我真的很开心。很高兴在博客上认识了一群志同道合的兄弟姐妹。没有你们的支持和鼓励,我不可能坚持下来。因为有你,我才能走得更远☀️☀️熬过去这段时间我一定会回来的,我爱你❤️❤️

吐槽

数论真是深不可测啊……还好我遇到的比较早。如果我在考试的时候遇到它,我就死定了。幸运的是,我的好朋友杨志哥发表了一篇文章,读后我学到了很多东西。不幸的是,它是用C++编写的,所以读起来有点不舒服。想看的朋友可以点击这里。

因式分解质因数

问题描述

求区间 [a,b] 中所有整数的质因数分解。

进入

输入两个整数a、b。

2<=a<=b<=10000

输出

3=3

4=2*2

5=5

6=2*3

7=7

8=2*2*2

9=3*3

10=2*5

分析

题输出有点难受,不过也是蓝桥VIP测试题,凑合着吧。

什么是主要因素?

数论中的质因数(或质因数)是指能整除给定正整数的质数。根据算术基本定理,每个正整数都可以唯一地表示为其素因子的乘积,无论排列顺序如何。两个没有共同质因数的正整数称为互质。

因此,如果一个数没有其他素因数,那么它的素因数就是它本身。

既然一个数可以用一个或几个质因数来表示,那么我们就可以从小到大遍历这个数。如果遇到质因数,我们就继续除它,直到不能再除为止(直到有小数)。向下。除法完成后,这个数就和刚才的质因数没有任何关系了。然后找到下一个素因数,重复上述步骤,直到这个数被除掉只剩下1为止。前面分离出来的才是首要因素。例如,客厅的桌子上有一个大蛋糕。小明饿了,就吃一口,然后再吃一口。当小明吃不下饭的时候,他才进房间。这时候馅饼少了一部分,而小明已经吃饱了,所以小明就不会再吃了。这时小明的爸爸看到了,因为饿了,就把馅饼吃了。等他吃饱了,如果还有的话,他妈妈可能会来吃等等。

现在我们只需要找到这些素因子,然后记录它们的数量,最后输出它们。

代码

def divide(n):
    i = 2
    
    while n != 1:       
        if n % i == 0:
            s = 0   
                   
            while n != 1 and n % i == 0:              
                s += 1
                n /= i
                
            dic[i] = s
            
        i += 1
n,m = map(int,input().split())
for r in range(n,m+1):
    
    dic = {}
    divide(r)
    res = ""
    print(f'{r}=',end='')
    for i in dic:
        
        for j in range(dic[i]):
            res += f"{i}*"
    print(res[:-1])

小O素数

想法

要查找素数,您可以使用艾利希筛法。每找到一个素数,就遍历一次数组,去掉素数的倍数,重复这个步骤。然后就可以得到素数的个数了。借用杨志的一张图。

代码

def is_prime(n):
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    
    for i in range(3,int(n**0.5)+1,2):
        if n % i == 0:
            return False
        
    return True
for _ in range(6):
    n, m = map(int,input().split())
    nums = [i for i in range(n,m+1)]
    result = 0
    for i in range(m-n+1):
        if nums[i]:
            result += 1
            for j in range(i,m-n+1,nums[i]):
                nums[j] = 0
                
                # print(nums)
    print(result)

阶乘除数问题

分析

咳咳,这是全国赛题。我们首先需要了解如何找到正因数。我们来看看杨志小凯整理的文章。非常好。

你必须了解如何求除数和除数之和,剩下的就很简单了。

我们只要遍历1到100,记录所有素因数的个数,最后用上面的公式输出即可。

代码

def prime_factor(n):
    
    i = 2
    
    while n != 1:        
        if n % i == 0:            
            s = 0           
            while n != 1 and n % i == 0:
                
                n /= i
                s += 1           
                 
            if i in dic:
                dic[i] += s
            else:
                dic[i] = s
                
        i += 1
dic = {}
for i in range(1,101):
    prime_factor(i)
    
res = 1
for i in dic.values():
    res *= i+1
print(res)

评价

分析

这是一道全国竞赛题。如果你知道通过素因数可以求出正因数,并且知道如何求素因数的个数,那么这道题就会变得容易了。也就是遍历所有的数字并得到它们的所有素因数。和数,最后应用公式来求解。如果是100,则返回结果。不是很清楚的同学可以再看一下这张图。

代码

def prime(n):
    
    mem = {}
    
    for i in range(2,n+1):
        
        if n % i == 0:
            cnt = 0
            while n != 1 and n % i == 0:
                n //= i
                cnt += 1
                
            mem[i] = cnt
            if n == 1:
                res = 1
                for i in mem:
                    res *= mem[i]+1
                return res
for i in range(4,int(1e6)):
    if prime(i) == 100:
        print(i)
        break

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

30阅读

外国教程python,python编程教学视频

2026年09月02日

24阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

26阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读