相亲数

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

问题描述:

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。
求100000以内的相亲数。

我的代码:

def perfect(n):
    a=1
    b=n
    s=0
    while a<b:
        if n%a==0:
            s=s+a+b
        a=a+1
        b=n/a
    if a==b and a*b==n:
        s=s+a
    return s-n
for i in xrange(1,100000):
    if perfect(perfect(i))==i:
        print i,perfect(i)

我的结果:

10000以内为例:

6 6        #完全数

28 28      #完全数

220 284

284 220

496 496    #完全数

1184 1210

1210 1184

2620 2924

2924 2620

5020 5564

5564 5020

6232 6368

6368 6232

8128 8128  #完全数

我的思路:

因为昨天做过了完全数的练习(http://www.cheemoedu.com/exercise/13),所以直接采用哪个快速求数的约数之和的函数,而剩下的就好办了,就是枚举判断输出了;

示例代码:

def sumOfFactors(k):
    p = 1
    q = k
    s = 0
    while p < q:
        if k % p == 0:
            s += p + q
        p += 1
        q = k / p
    if k == p * q and p == q:
        s += p
    return s - k
def fun(start, end):
    for x in range(start, end):
        y = sumOfFactors(x)
        if x < y and sumOfFactors(y) == x:
            print x, y
fun(2, 100000)

示例结果:

10000以内为例:

220 284

1184 1210

2620 2924

5020 5564

6232 6368

代码分析:核心函数没变,只不过加了一个函数,该函数不仅进行枚举判断操作而且对输出的数进行了过滤,而我的输出了全部,也把完全数输出了;

时间: 2024-10-08 08:16:46

相亲数的相关文章

算法进化历程之相亲数

巧若拙(欢迎转载,但请注明出处: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. 版主

相亲数--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 =

三种常用算法概述——遍试、迭代、递归

算法: 为解决某类问题而设计的操作序列(非可执行的指令序列) 特点:有穷性.确定性.可行性.输入输出 1.遍试算法: 逻辑上:针对所有的可能的情况进行判断 形式上FOR中用IF 示例: 韩信点兵 <span style="white-space:pre"> </span>using System; class HanXin { static void Main() { for(int n=1;n<=105;n++) if(n%3==2 &&

Project-Euler problem 1-50

最近闲的做了下Project Euler 上的题目,前面50题都比较简单,简单总结下.代码一般是Python和C/C++的 用Python 做这些题目简直是酸爽啊 一下代码可能不一定是我的,因为不知道论坛里面的回复不是永久的,所以我的代码有的丢了,可能找个和我的意思相近的代码.题目翻译是从 欧拉计划 | Project Euler 中文翻译站上面Copy 的表告我. Problem 1  Multiples of 3 and 5 10以下的自然数中,属于3和5的倍数的有3,5,6和9,它们之和是

欧拉计划21-23题

21.Amicable numbers Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). If d(a) = b and d(b) = a, where a  b, then a and b are an amicable pair and each of a and b are called amicable numbers. For

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

Snapchat - Amicable Pair

Amicable number(相亲数)定义: 相亲数(Amicable Pair),又称亲和数.友爱数.友好数,指两个正整数中,彼此的全部约数之和(本身除外)与另一方相等. 例如220与284: 220的全部约数(除掉本身)相加是:1+2+4+5+10+11+20+22+44+55+110=284 284的全部约数(除掉本身)相加的和是:1+2+4+71+142=220 相关题目1:给定整数n,找到小于n的所有amicable number的和 相关知识: 1.比如36 = 2^2 + 3 ^

projecteuler----&gt;problem=21----Amicable numbers

Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). If d(a) = b and d(b) = a, where a b, then a and b are an amicable pair and each of a and b are called amicable numbers. For example, the proper d

8628 相亲

Description 在咱遥远破旧的小村庄,男女成婚仍是以古老的.传统的模式:相亲,合时辰八字,合得来则订婚,择日 成亲.其中最忽悠的则是合时辰八字,话说是月老决定,实则是根据某条公式,算是否合得来.通过多年 的明察暗访,终于让我知道合地辰八字的公式了.其规则如下: 1. 根据某条公式将时辰八字转化成一个整数num, 为了方便起见,以后就用这个num表示该人的时辰八字. 2. 如果男女双方的时辰八字之和等于一个给定的数sum,则称此对时辰八字合得来.否则相反. 3. 如果时辰八字合不来的人结婚