题目地址:
https://www.lintcode.com/problem/amicable-pair/description
一对整数 a a a和 b b b是相亲数指的是 a ≠ b a\ne b a=b,并且 a a a的所有真因子的和恰好等于 b b b,并且 b b b的所有真因子的和恰好等于 a a a。返回所有 1 ∼ k 1\sim k 1∼k的相亲数对,要求每个数对小的在前大的在后。
直接计算一个数的因子即可。代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
/*
* @param k: An integer
* @return: all amicable pairs
*/
public List<List<Integer>> amicablePair(int k) {
// write your code here
List<List<Integer>> res = new ArrayList<>();
for (int i = 2; i <= k; i++) {
int sum = sumOfFac(i);
// 我们只找那些因子和大于自己的数
if (sum <= i || sum > k) {
continue;
}
if (sumOfFac(sum) == i) {
res.add(Arrays.asList(i, sum));
}
}
return res;
}
private int sumOfFac(int n) {
int i = 0, sum = 1;
for (i = 2; i * i < n; i++) {
if (n % i == 0) {
sum += i + n / i;
}
}
if (i * i == n) {
sum += i;
}
return sum;
}
}
时间复杂度 O ( k k ) O(k\sqrt k) O(kk),空间 O ( 1 ) O(1) O(1)。