四因数 (leetcode 181周赛T2)

 四因数难度中等1收藏分享切换为英文关注反馈给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。
如果数组中不存在满足题意的整数,则返回 0 。
 
示例:
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。

 
提示:

 1 <= nums.length <= 10^4
 1 <= nums[i] <= 10^5
 
解题思路
上午的比赛,一开始做 从1遍历到nums[i]一直超时,之后比赛结束后在讨论区有大神给了解答,从 遍历到平方根即可改了之后可以通过了
1.先判断是否为平方数,是平方数则一定不是四因子数,因为如果是平方数则它必有一个单独的因子,所以不可能是四因子数。
2.然后遍历到平方根,详细看下面注释。
 1 int sumFourDivisors(int* nums, int numsSize)
 2 {
 3     int sumfour = 0;
 4     int incflag = 0;
 5 
 6     for (int i = 0; i < numsSize; i++)
 7     {
 8         int flag = 0;
 9         int cnt = 1;
10         int sqrroot = sqrt(nums[i]);
11         int sum = 1 + nums[i];
12         for (int j = 2; j < sqrt(nums[i]); j++)
13         {
14             if (sqrroot * sqrroot == nums[i])  //如果是平方数直接跳出判断下一个数
15             {
16                 break;
17             }
18 
19             if (nums[i] % j == 0)
20             {
21                 cnt++;
22                 sum += (j + nums[i]/j);
23             }
24 
25             if (cnt > 2)
26             {
27                 break;
28             }
29         }
30         if (cnt != 2)
31         {
32             flag = 1;
33         }
34 
35         if (flag == 0)
36         {
37             incflag++;
38             sumfour += sum;
39         }
40     }
41 
42     if (incflag == 0)
43         return 0;
44     else
45         return sumfour;
46 }
 

猜你喜欢

转载自www.cnblogs.com/ZhengLijie/p/12545935.html