一个数的所有因数

Pythontip-Python 挑战练习-12

编写一个程序来求一个给定数字的所有因数。

  • 定义函数find_all_factors(),参数为num

  • 在函数内部,返回一个列表,列表中的数字是输入数字num的所以因数。

  • 如果输入数字小于1,则返回一个空列表。


    注意:

  • 找出能整除 num 的数(也就是 num 的因数),应该是当 num % i == 0(表示num除以i,余数为0) 时,才把 i 作为因数添加到列表 new 中。

  • 循环的结束值设为 num + 1,因为num 本身也是它自己的因数。

  • sort 方法是对列表本身进行原地排序,它会改变列表元素的顺序,但它的返回值是 None,而不是排序后的列表。

  • def find_all_factors(num):
        # 此处写你的代码 
        if num<1:
            return []
        new=[]
        for i in range(1,num+1):
            if num %i ==0:
                new.append(i)
        new.sort()
        return new
    
    # 输入一个数字 
    num = int(input())
    
    # 调用函数 
    print(find_all_factors(num))

一个所有因数可以采用以下几种常见方法: ### 枚举法 从 1 开始,依次判断该能否被 1 到该本身的每个整整除,如果能整除,则这个整就是该因数。以 360 为例,从 1 开始枚举: ```python num = 360 factors = [] for i in range(1, num + 1): if num % i == 0: factors.append(i) print(factors) ``` 这种方法简单直接,但对于较大的,效率较低,因为需要遍历从 1 到该本身的所有。 ### 分解质因数法 先将该分解为质因数的乘积形式,然后根据质因数的组合情况求出所有因数。例如对于一个 \(N = p_1^{a_1} \times p_2^{a_2} \times \cdots \times p_m^{a_m}\)(其中 \(p_i\) 为质,\(a_i\) 为对应的指),其因数可以通过 \(p_1^{b_1} \times p_2^{b_2} \times \cdots \times p_m^{b_m}\)(\(0 \leq b_i \leq a_i\))的形式组合得到。 以下是一个 Python 实现示例: ```python def prime_factors(n): factors = [] divisor = 2 while n > 1: while n % divisor == 0: factors.append(divisor) n = n // divisor divisor = divisor + 1 return factors def all_factors(n): prime_f = prime_factors(n) unique_prime = list(set(prime_f)) exponents = [prime_f.count(p) for p in unique_prime] num_factors = 1 for exp in exponents: num_factors *= (exp + 1) all_f = [] for i in range(num_factors): factor = 1 temp = i for j in range(len(unique_prime)): exp = temp % (exponents[j] + 1) factor *= unique_prime[j] ** exp temp //= (exponents[j] + 1) all_f.append(factor) all_f.sort() return all_f num = 360 print(all_factors(num)) ``` 这种方法通过先分解质因数,再根据质因数的指组合出所有因数,效率相对较高,尤其是对于较大的。 ### 优化枚举法 可以只枚举到该的平方根,因为如果 \(a\) 是 \(n\) 的因数,那么 \(\frac{n}{a}\) 也是 \(n\) 的因数。例如: ```python import math num = 360 factors = [] sqrt_num = int(math.sqrt(num)) for i in range(1, sqrt_num + 1): if num % i == 0: factors.append(i) if i != num // i: factors.append(num // i) factors.sort() print(factors) ``` 这种方法将枚举范围缩小到平方根,减少了不必要的计算,提高了效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值