zoukankan      html  css  js  c++  java
  • 相亲数--Python

      想亲数:在遥远的古代,人们发现某些自然数之间有特殊的关系:如果两个数a和b,a的所有除本身以外的因数之和等于b,b的所有除本身以外的因数之和等于a,则称a,b是一对相亲数

    code:

     1 def sumFunc(n):   #这个是求真因数的和,真因数不包括自己
     2     a = 1
     3     b = n
     4     sum = 0
     5     while a < b:
     6         if n % a == 0:
     7             sum += (a + b)
     8         a += 1
     9         b = n / a
    10     if a == b and n % a == 0:
    11         sum += a
    12     return sum - n
    13 
    14 for x in range(2,10000):
    15     y = sumFunc(x)
    16     if x < y and x == sumFunc(y):
    17         print(x,"<-相亲数->",y)

    这个求的是 2~10000 范围的想亲数

    然后这里里面其实可以改进,由于一个数可能会多次求真因数,我们就可以浪费空间,将已经求取真因数的数存到字典里,并且将求取的值作为valuse。

     1 cache = {}
     2 def sumFunc(n):   #这个是求真因数的和,真因数不包括自己
     3     res = cache.get(n,0)  #如果没有取到这个value的值就返回0
     4     if res:
     5         return res
     6     a = 1
     7     b = n
     8     sum = 0
     9     while a < b:
    10         if n % a == 0:
    11             sum += (a + b)
    12         a += 1
    13         b = n / a
    14     if a == b and n % a == 0:
    15         sum += a
    16     cache[n] = sum
    17     return sum - n
    18 
    19 for x in range(2,10000):
    20     y = sumFunc(x)
    21     if x < y and x == sumFunc(y):
    22         print(x,"<-相亲数->",y)

    我们其实可以导入时间模块,来计算一下这两个算法时间的快慢,程序开始使用 time.time()  ,程序结束的时候在使用一次 time.time()  ,然后计算差值就可以了

  • 相关阅读:
    P4396 [AHOI2013]作业 分块+莫队
    B1965 [Ahoi2005]SHUFFLE 洗牌 数论
    B1970 [Ahoi2005]Code 矿藏编码 暴力模拟
    B1968 [Ahoi2005]COMMON 约数研究 数论
    B1237 [SCOI2008]配对 贪心 + dp
    B1108 [POI2007]天然气管道Gaz 贪心
    B1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
    B1012 [JSOI2008]最大数maxnumber 分块||RMQ
    HAOI2007 反素数
    NOIP2009 Hankson的趣味题
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9516603.html
Copyright © 2011-2022 走看看