首页 > 代码库 > Project Eluer - 21
Project Eluer - 21
Amicable numbers
Problem 21
Let d(n) be defined as the sum of proper divisors of n (numbers less thann 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 andb are called amicable numbers.
For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.
Evaluate the sum of all the amicable numbers under 10000.
翻译:
我们定义一个函数叫d, d(n)表示求出所有小于n(1到n-1)内所有能被n整除的数的和。 比如d(220)=284(1+2+4+5+10+11+20+22+44+55+110=284)。
如果 d(a) = d(b) 且 a!=b 的话,我们称 a和b为友好数。求出 10000以内的所有友好数之和。
解决思路:
1. 定义一个函数 int d(int n) ,算是比起小的所有能被整除的数之和。
2.遍历1-10000,求其 d(n),拿到d(n)后,马上再求d(d(n)), 相当于是求: d(220)=284, d(d(220))=220一样。这样避免重复遍历。 这是直接判断 n是否等于d(d(n)) 且 n!=d(d(n)) 就知道 n 和 d(d(n)) 是否是友好数,做累加。
代码:
package projectEuler; public class Problem20 { private static final int SIZE = 10000; public static void main(String[] args) { int result = 0; for (int i = 1; i <= SIZE; i++) { int di = d(i); // i==d(di) && i != di // i相当于原数,相当于例子中到 220,求了d(220)后 di=284,所有再判断 // d(di)=d(284)是否等于220(i).判断两数是否相等是 di和i if (d(di) == i && di != i) { System.out.printf("%d <=> %d\n", i, di); result += i; } } System.out.println("result:" + result); } static int d(int n) { int result = 0; for (int i = 2; i <= Math.sqrt(n); i++) { if (0 == n % i) { result = result + i + n / i; } } return result + 1; // 1 是可以被所有数整除 } }
答案:
31626
Project Eluer - 21