完全数

程序地址:http://www.cheemoedu.com/exercise/13

问题描述:

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。例如,第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
编程求10000以内的完全数。

我的代码:

import datetime
starttime = datetime.datetime.now()
def perfect(n):
    m=[i for i in range(1,n/2+1) if n%i==0]
    if sum(m)==n:
        print n
for k in range(1,10000):
    perfect(k)
endtime = datetime.datetime.now()
print (endtime - starttime).seconds

我的思路:

首先定义一个求一个数的所有约数的函数(这个函数一定要尽量快速简单,否则计算100内的完全数还行,范围大一点的话就会奇慢无比),然后用for循环遍历即可;

之前淘汰的代码:

def perfect(n):
    a=[]
    for i in range(1,n+1):
        for j in range(n,0,-1):
            if i*j==n:
                a.append(i)
    a.pop()
    if sum(a)==n:
        print n
for k in xrange(1,10000):
    perfect(k)

思路其实很简单,实现起来也容易,但是想要很快速的显示完全数却是个不简单的任务,起初,我没觉得难(100以内的秒出),可是范围增大到1000时,速度明显慢了很多,到10000时,等了10几分钟都没反应,后来我进行了优化,根据“完全数都是以6或8结尾(如果以8结尾,那么就肯定是以28结尾)”原理,将范围缩减到了1000多个数,可是还是很慢很慢,后来又根据“除6以外的完全数,它们被3除余1、9除余1、还有1/2被27除余1(百科上看的)”将范围缩减到了120多个,但是还是慢(长达14秒),这才意识到是代码写的有问题,想来想去就写了最上面的那个,它的结果为:

E:\python\python.exe D:/pycharm/python/奇猫百题/完全数.py

6

28

496

8128

6    #运行时间为6秒

虽然计算10000以内的还算可以,但是在增加一个数量级又会很慢,没辙了,这时我所能想到的最快的方法了。

示例代码:

def isPerfectNumber(n):
    a = 1
    b = n
    s = 0
    while a < b:
        if n % a == 0:
            s += a + b
        a += 1
        b = n / a
    if a == b and a * b == n:
        s += a
    return s - n == n
for k in range(2, 10000):
    if isPerfectNumber(k):
        print k

代码分析:

示例代码的while循环是一边算传入数的约数,一边求其和,然后判断是否满足关系,满足的话就多加个a(两个约数相等且积为原数),其次还要减去n(第一次循环时加上了b),最后再返回完全数;

虽然a是递增的,但是b的范围几乎是折半的,而且比较的是a和b的大小,所以它每一个数循环的次数都很少,而且不用再另算总和,所以比我的要快,事实证明,在计算10000以内的完全数时几乎是秒出,而100000时才用了11秒,真的比我的要好很多。

时间: 2024-10-13 02:39:27

完全数的相关文章

d010:盈数、亏数和完全数

题目: 对一个正整数N而言,将它除了本身以外所有的因子加起来的总和为S,如果S>N,则N为盈数,如果S<N,则N为亏数,而如果S=N,则N为完全数(Perfect Number).例如10的因子有1.2.5.10,1 +2+5=8<10,因此10为亏数,而12的因子有1.2.3.4.6.12,1+2+3+4+6=16>12,因此12为盈数.至于6的因子有1.2.3.6,1+2+3=6,所以6是完全数(它也是第一个完全数).现在请你写一个程序,输入一个正整数N,然后印出它是盈数.亏数

丰沛数_不足数_完全数

因数的和比数字本身大的数称为丰沛数. 因数的和比数字本身小的数称为不足数. 完全数是一个整数:其因数之和(不含本身打因素)加起来就是数字本身. 1 theNum = int(raw_input('Please input a number to check:')) 2 3 divisor = 1 4 sumOfDivisor = 0 5 6 while divisor < theNum: 7 if theNum % divisor == 0: 8 print divisor, 9 sumOfDi

求完全数的程序源码

一.完全数 完全数(Perfectnumber)是一些特殊的自然整数.完全数等于其所有因子的和.这里所谓的因子是指所有可以整除这个数的数,而不包括该数本身.本节将简单介绍完全数的基本规则和性质,以及判断完全数的算法. 1.1  什么是完全数 其实谈到完全数,与之相关的两个概念便是亏数和盈数.一般来说,通过其所有真因子的和来判断一个自然数是亏数.盈数及完全数. 当一个自然数的所有真因子的和小于该自然数,那么该自然数便是亏数: 当一个自然数的所有真因子的和大于该自然数,那么该自然数便是盈数: 当一个

3.python算法之完全数

代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: 3.完全数.py @time: 2016/3/21 18:02 """ n = 24 # for i in range(1,n): # if n % i ==0: # print(i) def isperfectNumber(n): a = 1 b = n s = 0 while a < b:

Java8新特性——lambda表达式.(案例:完全数分类)

需求:输入一个数,判断其类型(完全数,过剩数,不足数) 完全数:自身之外所有因数和==自身 过剩数:自身之外所有因数和>自身 不足数:自身之外所有因数和<自身 1 package cn._3.numberclassifier; 2 3 //BEGIN number_classifier_java8 4 import java.util.List; 5 import java.util.stream.IntStream; 6 7 import static java.lang.Math.sqrt

Java版求1000以内的完全数

/* * 若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数,简称完数. * 例如:6=1+2+3. * 题目:求1000以内的完全数. */ public class PerfectNumber { // 数字上限 static Integer limit = 1000; public static void main(String[] args) { System.out.println(limit + "以内的完全数有:"); fun(lim

完全数java

完全数:小于本身的所有因子的和(包括1) public class test01 { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); for (int i=2;i<=n;i++){ int sum=0; for (int j=1;j<i;j++) if (i%j==0) sum+=j; if (sum==i) System.out.

【华为OJ】【036-iNOC产品部--完全数计算】

[华为OJ][算法总篇章] [华为OJ][036-iNOC产品部–完全数计算] [工程下载] 题目描述 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数. 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身. 例如:28,它有约数1.2.4.7.14.28,除去它本身28外,其余5个数相加,1+2+4+7+14=28. 给定函数count(int n),用于计算n以内(含n)完全数的个数.计算范围, 0 < n <= 500000 返回n以内

求出10000以内所有的完全数-python

题目: 如何用python去求出下一个(大于28的)完全数? (求出10000以内所有的完全数) 分析: 如果一个数恰好等于它的因子之和,则称该数为"完全数".各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数,又称完美书或完备数. 1.第一个完全数是6,它有约数1,2,3,6,除去它本身6外,其余3个数相加为:1+2+3=6 2.第二个完全数是28,它有约数1,2,4,7,14,28,除去它本身28外,其余5个数相加为:1+