Project Euler 95:Amicable chains 亲和数链
The proper divisors of a number are all the divisors excluding the number itself. For example, the proper divisors of 28 are 1, 2, 4, 7, and 14. As the sum of these divisors is equal to 28, we call it a perfect number.
Interestingly the sum of the proper divisors of 220 is 284 and the sum of the proper divisors of 284 is 220, forming a chain of two numbers. For this reason, 220 and 284 are called an amicable pair.
Perhaps less well known are longer chains. For example, starting with 12496, we form a chain of five numbers:
12496 → 14288 → 15472 → 14536 → 14264 (→ 12496 → …)
Since this chain returns to its starting point, it is called an amicable chain.
Find the smallest member of the longest amicable chain with no element exceeding one million.
一个数除了本身之外的因数称为真因数。例如,28的真因数是1、2、4、7和14。这些真因数的和恰好为28,因此我们称28是完全数。
有趣的是,220的真因数之和是284,同时284的真因数之和是220,构成了一个长度为2的链,我们也称之为亲和数对。
有一些更长的序列并不太为人所知。例如,从12496出发,可以构成一个长度为5的链:
12496 → 14288 → 15472 → 14536 → 14264 (→ 12496 → …)
由于这条链最后又回到了起点,我们称之为亲和数链。
找出所有元素都不超过一百万的亲和数链中最长的那条,并给出其中最小的那个数。
解题
暴力应该可以的,直觉是简单的。如果对每个数求出其真因子的和,然后再求真因子和的真因子和,这样的时间复杂度很好,表示没有跑出来结果。然后发现这里的计算真因子的和的过程中重复的数很多的。所以可以先求出真因子的数的和,这样就是一个数组,下面的问题就是在数组中求第一个最长链的开始的值,这里开始没有理解对,以为是求最长链中许多数中的最小值那个,但是发现最长链的最小值就是其第一个值。还有上面也说了是求的第一个最长链,所以主要小于100万的最长链长度是28 有好多个的。
那么如何求亲和数链?
注意:
1.不是每个数有亲和数链的,如这个链接说的也是比较有意思的
问题还是如何找到链?
很显然的是我们发现 从a 开始的链会从 a结束,这个是有顺序要求的
可以发现,是亲和数链的时候不会出现环,这个很显然,但是也是解题的关键
所以发现环了就要结束
然后再判断结束时候的值和原始开始的值是否相等,相同求其长度。
JAVA
package Level3;
import java.util.TreeSet;
public class PE094{
public static void run2(){
int MAX = 1000000;
int[] next = new int[MAX];
// 真因数的和
for(int i=2;i<MAX;i++)
next[i] = 1;
for(int i=2;i<MAX/2+1;i++)
for(int j=2*i;j<MAX;j+=i){
next[j] +=i;
}
int longest = -1;
int subMIN = Integer.MAX_VALUE;
int MIN = Integer.MAX_VALUE;
int j =2;
TreeSet<Integer> set = new TreeSet<Integer>();
for(int i=2+8;i<MAX;i++){
set.clear();
j = i;
// 记录最小值
subMIN = j;
set.add(j);
while(true){
j = next[j];
if(j>=MAX) break;
// 记录最小值
subMIN = subMIN>j?j:subMIN;
// 出现循环 结束
if(set.contains(j)==true)
break;
set.add(j);
}
if( j==i ){
// 这个的不好,在相同的长度时候 进行了更新
// longest = Math.max(set.size(), longest);
// 记录长度最小的那个 这里在相同的长度时候只记录最小的
if(set.size() >longest){
longest = set.size();
MIN = subMIN;
System.out.println(longest +" "+MIN + " "+ j);
}
}
}
System.out.println(longest +" "+MIN);
}
public static void main(String[] args) {
long t0 = System.currentTimeMillis();
run2();
long t1 = System.currentTimeMillis();
long t = t1 - t0;
System.out.println("running time="+t/1000+"s"+t%1000+"ms");
}
}
结果
28 28
220 220
12496 12496
14316 14316
14316
running time=2s415ms
第一个数是链的长度,链的最小值,链的第一个数
其实是比较多的,题目求的是第一个最长链,直接看题目容易误解。
在上面求真因数的和中,和筛选法求素数的思想很类似,知道数的规律,进行求解。
Python 是直接在论坛中找到
# coding=gbk import time as time def run():
MAX = 1000000
d = [1]*MAX
for i in xrange(2,MAX//2):
for j in xrange(2*i,MAX,i):
d[j]+=i
max_cl = 0
for i in xrange(2,MAX):
n,chain = i,[]
while d[n]<MAX:
d[n],n = MAX+1,d[n]
try:k=chain.index(n)
except ValueError:chain.append(n)
else:
if len(chain[k:]) >max_cl:
max_cl,min_link = len(chain[k:]),min(chain[k:])
print min_link
t0 = time.time()
run()
t1 = time.time()
print "running time=",(t1-t0),"s"
running time= 5.47899985313 s
Project Euler 95:Amicable chains 亲和数链的更多相关文章
- Python练习题 048:Project Euler 021:10000以内所有亲和数之和
本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- [project euler] program 4
上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Project Euler 9
题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...
- Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...
- project euler 169
project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...
- 【Project Euler 8】Largest product in a series
题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...
- Project Euler 第一题效率分析
Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...
随机推荐
- Windows7系统禁用USB和启用USB方法
被迫装了XX软件之后,无线网络和USB都被禁用了,XX软件还不能被卸载.只能用PE进去时候把XX软件安装目录进行删除,但是删除之后还是不能识别U盘,从网上找到办法一看是注册表的项被修改了. 注册表项为 ...
- jquery 在页面中三种写法
jQuery 分 2 个系列版本 1.x 与 2.x,主要的区别在于 2.x 不再兼容 IE6.7.8浏览器,这样做的目的是为了兼容移动端开发.由于减少了一些代码,使得该版本比 jQuery 1.x ...
- 分享:PHP数组排序总结
本文内容:PHP二维数组排序,PHP数组排序总结. php数组排序是PHP学习中最基础也是最重要的一部分. 1.常规数组的排序 常规数组是指数组各元素均为字符串或数字,这与这样的数组,我们可以采用so ...
- phpExcel导出excel的类,每步都有说明
require_once WEB_PATH . '/lib/PHPExcel/PHPExcel.php'; require_once WEB_PATH . '/lib/PHPExcel/PHPExce ...
- Hibernate之HQL总结
hibernate运行过程: Hibernate作用 1.hibernate是java应用和关系数据库之间的桥梁,她负责java对象和关系数据库之间的映射. 2.hibernate内部封装了通过JDB ...
- ASP.NET中的ViewState
曾经在两次面试中都遇到了这个问题,就是ViewState中存储的变量到底存储在哪里.由于基础比较差,以前在学习的时候,就没有注意 到这里的细节,包括Session中存储的变量,所以我想ViewStat ...
- Python的类实例方法,类方法,类静态方法
以下面的类定义为例: # coding:utf-8 class A: count = 0 def __init__(self, inst_name): self.inst_name = inst_na ...
- sublimetext2 中运行Python提示EOFError: EOF when reading a line
解决方法:一.安装sublimeREPL 打开sublimeText2按CTRL+SHIFT+P,英文版输入:install后选择Package Control: Install Package ...
- 【转】如何在 Windows 中执行干净启动
完成故障排除后,请执行以下步骤将计算机重置为正常启动. Windows 8.1 和 Windows 8 从屏幕右边缘滑入,然后点按“搜索”.您也可以将鼠标指向屏幕的右下角,然后单击“搜索”. 在搜索框 ...
- Python之str(),repr(),``
对于对象obj: str()生成的字串是给人看的 repr()生成的字串是给解析器看的 ``与repr()等义. 最直接就是: ------------------- obj=eval(repr(ob ...