首页 > 代码库 > 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 ab, 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