• 蓝桥杯python组--基础训练---2、#一个数如果恰好等于它的因子之和,这个数就称为“完数”,;例如:6=1+2+3,找出1000以内的


    题目

    找出n以内的完数,如1000以内。
    完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
    例如:6=1+2+3;28=1+2+4+7+14;…

    思路1

    # 循环输出11000之间的数  range():含头不含尾
    for i in range(1,1001):
        # 此时i代表1-1000之间所有的数
        # 定义和的初始值
        sum = 0
        # 构造数字的因子
        for j in range(1,i):
        #     因子:能被i整除的是i的因子
            if i % j == 0:
        #     只要是i的因子那么就相加
                sum += j
        # 如果 因子相加的和  等于i本身那么这个数就是完数
        if sum == i:
            print(f"{i}是完数")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    或者也可以这样写

    for i in range(1,1000):
        s = []
        for j in range(1,i):
            if i%j == 0:
                s.append(j)
        if sum(s) == i:
            print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结果

    在这里插入图片描述

    思路2

    from functools import reduce
    def sum(a,b):
        return a+b
    for i in range(2,1001):
        l = [1]
        for j in range(2,int(i/2+1)):
            if i%j==0:
                l.append(j)
        if i == reduce(sum,l):
            print(i)
            print(l)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果

    在这里插入图片描述

    思路3

    count = 0
    for i in range(1,1001):
        list1 = []
        for j in range(1,i):
            if i%j==0:
                list1.append(j)
        if sum(list1)==i:#sum函数求和
            count +=1
            print('%d是完数,因子是'%i,list1)
    print('1000以内的完数总共有%d个'%count)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果

    在这里插入图片描述

    思路4

    count  = 0
    for i in range(2,1000):
        s = 0
        for j in range(1, i):
            if(i%j==0):
                s=s+j
        if(s==i):
            count = count + 1
            print(i)
    print("1~1000的完全数共有{}个".format(count))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果

    在这里插入图片描述

    思路5

    a = []                                     # 创建空列表用于储存因子
     
    for i in range(2, 1000):              # 取除数
        for j in range(1, i):                  # 取小于除数的数作为被除数
            if i % j == 0:                # 如果两数相除,取余为0,也就是能整除,说明是因子
                a.append(j)                    # 将因子储存在列表里
        if sum(a) == i:                   # 当除数为i的情况完成后,将列表中的数求和,看是否满足因子相加等于除数的条件
            print(f"{i}是完数,因子包括{a}")    # 若符合,则输出完数和因子
        a.clear()                         # 将列表元素清除,进行下一个(i+1)的情况
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果

    在这里插入图片描述

    思路6

    这个方法也是可以的,但是他不能在idle上运行。比赛的时候不能用pycharm。
    在这里插入图片描述

    结果

    在这里插入图片描述

    思路7

    判断这个数是否是完数。但是并不能找出n以内的完数,也不能写出他们的因子。

    n = int(input('::'))
    c1 = 0
    i = 1 
    while i<=n-1: # 注意:要小于n
        if n%i == 0:
             c1+=i
        i+=1
    if c1==n:
        print('这个数是完数')
    else:
        print('这个数不是完数')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    结果

    在这里插入图片描述

    思路8

    def n(n):
        count = 0
        for i in range(1,n):
            if n%i==0:
                count +=i
        if count==n:
            return True
        else:
            return False
    
    for i in range(1,1001):# 1-1000判断
        if n(i):
            print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果

    在这里插入图片描述

    思路9

    factor=[] 
    for i in range(1,1000):
        for j in range(1,i):
            if i % j ==0:
                factor.append(j)
        if sum(factor)==i:
            print(i,"是完数")
    
        factor=[]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果

    在这里插入图片描述

    总结

    感觉这些方法都是大同小异,选择一个比较合适的就可以了。
    列举这几种方法是方便大家学习。有不同的方法可以在评论留言。

  • 相关阅读:
    linux安装showdoc——让你避过大坑
    在Spring Boot中使用POI完成一个excel报表导入数据到MySQL的功能
    Linux:实用操作
    30天啃透这份Framework 源码手册直接面进大厂
    C语言,数据在内存中的存储。——保姆级教学
    C++初阶 List的介绍和使用
    机器学习终极指南:统计和统计建模03/3 — 第 -3 部分
    Java知识点之单例模式
    异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (三)
    Java关键字说明
  • 原文地址:https://blog.csdn.net/m0_61985580/article/details/127613339