目标
给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。如果数组中不存在满足题意的整数,则返回 0 。
示例 1:
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。
示例 2:
输入: nums = [21,21]
输出: 64
示例 3:
输入: nums = [1,2,3,4,5]
输出: 0
说明:
- 1 <= nums.length <= 10^4
- 1 <= nums[i] <= 10^5
思路
有一个整数数组 nums,返回恰好有 4 个因数的元素的这些因数之和,如果不存在,返回 0。
首先数组元素至少有两个因数(1 和它本身),只需要再找到两个因数即可。从 2 ~ sqrt(num) 判断能否整除 num,如果可以加上 i 与 num / i,需要特殊处理 i * i = num 的情况,这时因数只能算一个。
代码
/**
* @date 2026-01-04 9:05
*/
public class SumFourDivisors1390 {
public int sumFourDivisors(int[] nums) {
int res = 0;
for (int num : nums) {
res += sum(num);
}
return res;
}
public int sum(int num) {
int cnt = 2;
int sum = num + 1;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
if (cnt == 4) {
sum = 0;
break;
}
if (i * i == num) {
sum += i;
cnt++;
} else {
sum += i + num / i;
cnt += 2;
}
}
}
return cnt == 4 ? sum : 0;
}
}
性能
