蓝桥杯求100!的正约数

该博客介绍了如何不用暴力求解计算100!的正约数个数。通过分解1到100所有数的质因数,并统计每个质因数的出现次数,利用公式(n+1) * (m+1)计算每个质因数对约数个数的贡献,最终相乘得到总约数个数。博主提供了Python代码示例来实现这一过程,并得到了正确答案39001250856960000。
部署运行你感兴趣的模型镜像

蓝桥杯求100!的正约数

这个问题猛地一看好像不能用暴力求解,他就是不能用暴力求解,因为这个数太大了。

怎么解决

1、首先我们要把1*2*3…100的质因数全部求出来。

​ 用暴力求解去遍历1~100,每个数的质因数,然后存在一个result的全局列表中

2、在计算每个质因数出现的次数,这里我用的是字典存储每个数字出现的次数

这里涉及到一个计算公式
$$
整数=质因数n*质因数m

$$

整数的约数的个数=(n+1)∗(m+1) 整数的约数的个数=(n+1)*(m+1) =(n+1)(m+1)

例如
$$
12=223=2^2*3

12的约数的个数就是n 12的约数的个数就是n 12n
n=(2+1)*(1+1)
$$
他们分别是1,2,3,4,6,12

100!的代码

result = []  # 存取所有的质因数
dirct = {}  #存放质因数出现的次数


count = 1
def demo(n):#求解质因数的函数
    k = 2
    global result
    while n > 1:
        if n % k == 0:
            result.append(k)
            n = n / k
        else:
            k += 1

# 求解每个数的质因数
for i in range(2, 101):
    demo(i)
print(result)

# 记录每个质因数出现的次数
for i in result:
    if i not in dirct.keys():
        dirct[i] = 1
    else:
        dirct[i] += 1
print(dirct)#质因数出现的次数

# 计算约数出现的次数
for values in dirct.values():
    count *= (values + 1)

print(count)

以上内容仅供参考:

算出的答案:39001250856960000

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 关于蓝桥杯国赛中的最大公约数算法解题思路 #### 背景介绍 蓝桥杯竞赛作为一项全国性的信息技术赛事,其试题设计通常涵盖了广泛的计算机科学基础知识。其中,“最大公约数”问题是常见的考点之一,尤其是在涉及整数运算、循环结构以及递归函数的应用场景下。 #### 数学定义与性质 最大公约数(Greatest Common Divisor, GCD),是指两个或多个整数共有约数中最大的一个。解最大公约数的经典方法是欧几里得算法(Euclidean Algorithm)。该算法的核心原理基于如下定理: 对于任意整数 \(a\) 和 \(b\) (\(a > b\)),\(\text{gcd}(a, b) = \text{gcd}(b, a \% b)\),直到其中一个参数变为零为止[^1]。 #### 欧几里得算法实现 以下是使用 C++ 实现的最大公约数算法代码: ```cpp #include <iostream> using namespace std; // 使用迭代方式实现欧几里得算法 int gcd(int a, int b) { while (b != 0) { // 当余数不为零时继续执行 int temp = a % b; a = b; // 更新较大值 b = temp; // 更新较小值 } return a; // 返回最终结果 } // 主程序测试 int main() { int num1 = 48, num2 = 18; cout << "The GCD of " << num1 << " and " << num2 << " is: " << gcd(num1, num2) << endl; return 0; } ``` 此外,也可以通过递归的方式简化上述逻辑: ```cpp // 使用递归方式实现欧几里得算法 int gcd_recursive(int a, int b) { if (b == 0) return a; // 终止条件 return gcd_recursive(b, a % b); // 递归调用 } ``` 这两种实现方式均具有较高的效率,在实际应用中可根据具体需选择合适的形式。 #### 扩展——最小公倍数计算 在某些情况下,除了需要解最大公约数外,还可能涉及到最小公倍数(Least Common Multiple, LCM)的计算。两者之间存在以下关系: \[ \text{lcm}(a, b) = \frac{|a \times b|}{\text{gcd}(a, b)} \] 因此,可以进一步扩展功能来支持这一操作: ```cpp long long lcm(long long a, long long b) { return abs(a * b) / gcd(a, b); } ``` 此部分补充说明有助于应对更复杂的题目情境。 #### 总结 针对蓝桥杯国赛中的最大公约数问题,推荐采用经典的欧几里得算法解决。无论是迭代还是递归形式均可满足性能要,并且易于理解和维护。同时掌握最小公倍数的相关概念能够增强解决问题的能力范围。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值