Python编程算法【二十五】 亲密数
【案例内容】
如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
【解题思路】
可以先定义一个函数,专门用来处理各因子之和。步骤是先通过计算得到某个数的所有因子,然后将各个因子放入一个列表中,最后通过sum函数,即可求得各因子之和,并把最终的总和作为函数的返回值。需注意的是,如果因子数只有一个,那么是不符合题意的,这时函数的返回值可以直接设为0。
接着再设置两个列表,分别用作存储所有的亲密数,以及去掉重复的亲密数。比如220和284是一对亲密数,可经过程序运行后,就会找到两组亲密数:220和284,以及284和220,其实它们就是同一组的亲密数,因此需要把重复的亲密数去掉。这时可以利用集合,因为集合是无序的,也就是{220, 284}与{284, 220}是视为相同的,那么我们就可以通过循环,把不相同的亲密数放入到一个新列表中,从而达到去重的效果。最后再分别读取集合中的两个数即可。
另外,根据题意,因子是包括1,不包括该数本身,所以循环的范围可以设定为4-3001,因为1、2、3的因子除了1,就是自己本身,可以直接去掉这三个数。
【Python代码】

本题在找到亲密数后,应该把找到的亲密数放入集合中,而不是放入列表中。因为列表是有序的,也就是 [220, 284] 与 [284, 220] 在Python中会被当成两个不同的列表,它们顺序不同。因此在去重时,就会当成不重复的两组亲密数,而实际上它们就是一组亲密数