相亲数--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()  ,然后计算差值就可以了

原文地址:https://www.cnblogs.com/luojianyi/p/9516603.html

时间: 2024-11-02 17:17:55

相亲数--Python的相关文章

相亲数

程序地址:http://www.cheemoedu.com/exercise/14 问题描述: 220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284284的真因数之和为1+2+4+71+142=220毕达哥拉斯把这样的数对A.B称为相亲数:A的真因数之和为B,而B的真因数之和为A.求100000以内的相亲数. 我的代码: def perfect(n):     a=1     b=n     s=0     while a<b:         if n%a==

算法进化历程之相亲数

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 题目来自于编程论坛"吴健飞飞"的提问:求4位数以内的相亲数对 2500年前数学大师毕达哥拉斯发现,220与284两数之间存在下列奇妙的联系: 220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284 284的真因数之和为1+2+4+71+142=220 毕达哥拉斯把这样的数对a,b称为相亲数:a的真因数(小于本身的因数)之和为b,而b的真因数之和为a. 版主

【BZOJ2822】【AHOI2012】树屋阶梯 卡特兰数 python高精度

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43404565"); } 题解: 首先考虑在当前情况下多加一层,那么我们可以枚举最后一层台阶长度来得到答案. 最后得到的是卡特兰数. 代码: f=[0]*60 f[1]=1 n=int(raw_input()) for i in range(2,n+1

回文数---Python

回文数是从两端读都一样的数.可表示为2个2位数乘积的最大回文数是9009=91×99. 请找到可表示为2个三位数乘积的最大回文数.

细数Python与C++的区别(更新中……)

Python与C/C++有不少区别,其中一些很容易疏忽,导致程序出错.这里列了一些,供大家参考.持续更新中-- Python没有自增自减运算符 C/C++中有++i.i++.--i.i--.而Python则没有这些运算符.C/C++的一个常见循环是: for (int i = 0; i < 10; ++i) { std::cout << i << endl; } 而Python对应的循环为: for i in range(10): print (i) 也许这是Python不提

数数python编程语言的优缺点 python开发

Python的定位是"优雅"."明确"."简单",所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序. python语言的优点 ⑴ 作为初学python的科班出身的小白,python非常简单,非常适合人类阅读.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一.它使你能够专注于解决问题而不是去搞明

“肥宅快乐数”-python暴力版

编写一个函数来判断一个数是不是"快乐数".一个"快乐数"定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1.如果可以变为 1,那么这个数就是快乐数 num = input('请输入数字>>>').strip() new_num = num if num.isdigit(): sum1 = 0 check = [] while sum1 !=1: for i in

vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 例子1 例子输入1[复制] 5 例子输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=

孩子们的游戏(圆圈中最后剩下的数) -python

思路:用一个指针,循环遍历列表,模拟每个在场孩子报数,用cnt计数,当报到m-1后,将这个人出列,cnt置为0,剩下的人继续报数 # -*- coding:utf-8 -*- class Solution: def LastRemaining_Solution(self, n, m): # write code here if n == 0 and m == 0: return -1 child = [i for i in range(n)] p = 0 cnt = 0 while len(ch