目录

  • 一、1390.四因数
    • 1.题目
    • 2.分析
    • 3.代码

一、1390.四因数

1.题目

1390.四因数

给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。
如果数组中不存在满足题意的整数,则返回 0 。
1 <= nums.length <= 104
1 <= nums[i] <= 105

2.分析

这道题涉及到的知识点:

  1. 等比数列求和:Sn=a1+a1q+a1q2+...+a1qn−1=a1(1−qn)(1−q)S_n = a_1 + a_1q + a_1q^2 + ... + a_1q^{n-1} = {a_1(1 - q^n) \over (1-q)}Sn​=a1​+a1​q+a1​q2+...+a1​qn−1=(1−q)a1​(1−qn)​,这条公式有助于下面公式的理解。
  2. 关于因子数与因子和:
    定义1:因子和函数 σ 定义为整数n所有正因子之和,记为σ(n)σ_{(n)}σ(n)​
    定义2:因子个数函数 τ 定义为正整数n的所有正因子个数,记为τ(n)τ_{(n)}τ(n)​.
    定理1:设 p 是一个素数,a 是一个正整数,那么
      σ(pa)=1+p+p2+p3+...+pa=(pa+1−1)/(p−1)σ_{(p^a)} = 1 + p + p^2 + p^3 + ... + p^a = (p^{a+1} - 1)/(p - 1)σ(pa)​=1+p+p2+p3+...+pa=(pa+1−1)/(p−1)
      τ(pa)=a+1,(pa的因子为1,p,p2,...pa)τ_{(p^a)} = a + 1,(p^a的因子为1,p,p^2,...p^a)τ(pa)​=a+1,(pa的因子为1,p,p2,...pa)
    定理2:设正整数n有素因子分解n=p1a1∗p2a2∗.....psas(唯一分解定理)n = p_1^{a_1} ∗ p_2^{a_2} ∗ . . . . . p_s^{a_s}(唯一分解定理)n=p1a1​​∗p2a2​​∗.....psas​​(唯一分解定理)
      因子和:σ(n)=(p1a1+1−1)/(p1−1)∗(p2a2+1−1)/(p2−1)...(psas+1−1)/(ps−1)=∏i=1s(piai+1−1)/(pi−1)σ_{(n)} = (p_1^{a_1+1} - 1)/(p_1 - 1) * (p_2^{a_2+1} - 1)/(p_2 - 1)...(p_s^{a_s+1} - 1)/(p_s - 1) = \prod_{i=1}^s(p_i^{a_i+1} - 1)/(p_i - 1)σ(n)​=(p1a1​+1​−1)/(p1​−1)∗(p2a2​+1​−1)/(p2​−1)...(psas​+1​−1)/(ps​−1)=∏i=1s​(piai​+1​−1)/(pi​−1)
      因子数:τ(n)=(a1+1)∗(a2+1)∗...∗(as+1)=∏i=1sai+1τ_{(n)} = (a_1 + 1)*(a_2 + 1)*...*(a_s + 1) = \prod_{i=1}^sa_i + 1τ(n)​=(a1​+1)∗(a2​+1)∗...∗(as​+1)=∏i=1s​ai​+1

这道题返回所有四因子整数的因子和,因此需要结合定理2的两条公式:

  1. 遍历数组,取到每一个数。
  2. 对每一个数 num,遍历 [ 2 , num\sqrt {num}num​ ],当遇到一个能整除 num 的数 i,则 while 循环一直除以 i,直到不能再被 i 整除为止,期间分别记录除以 i 的次数(作为因子数公式的 aia_iai​)以及乘积(作为piaip_i^{a_i}piai​​),并代入定理2公式求因子和与因子数。
  3. 最后判断,因子数 count 是否等于4,不等于4则跳过执行下一循环,等于4则加上该数因子和。

优化:

看了题解发现了可以优化的地方,

  • 在 while 循环结束后,计算完因子数 count 初步的值,就可以判断 num > 1 的数因子数 count 是否大于2。
  • 因为后续因子数要乘2,如果此时已经大于2,则最后得到的因子数必然大于4,在这里就可以直接跳出循环。

3.代码

    public int sumFourDivisors(int[] nums) {//所有因子数之和int i,result = 0;for (int num : nums) {//因子数int count = 1;//因子和int sum = 1;for (i = 2;i * i <= num;i++){if (num % i == 0){int a = 0;int t = 1;while (num % i == 0){num /= i;a++;t *= i;}count *= (a + 1);sum *= ((t * i - 1) / (i - 1));}}if (num > 1){count *= 2;sum *= (num + 1);}if (count != 4){continue;}result += sum;}return result;}


优化后:

    public int sumFourDivisors(int[] nums) {//所有因子数之和int i,result = 0;for (int num : nums) {int count = 1;int sum = 1;for (i = 2;i * i <= num;i++){if (num % i == 0){int a = 0;int t = 1;while (num % i == 0){num /= i;a++;t *= i;}count *= (a + 1);//因为最后还有*2 所有这里>2的时候 因子数就会大于4if (count > 2 && num >1) {break;}sum *= ((t * i - 1) / (i - 1));}}if (num > 1){count *= 2;sum *= (num + 1);}if (count != 4){continue;}result += sum;}return result;}

【LeetCode解题报告】《算法基础012_因子和》- Java相关推荐

  1. [LeetCode解题报告] LCP 48. 无限棋局

    [LeetCode解题报告] LCP 48. 无限棋局 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. ...

  2. LeetCode解题报告汇总

    LeetCode解题报告: [LeetCode]1.Two Sum - Yoona - 博客频道 - CSDN.NET [LeetCode]2.Add Two Numbers - Yoona - 博客 ...

  3. [LeetCode解题报告] 741. 摘樱桃

    [LeetCode解题报告] 741. 摘樱桃 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描述 ...

  4. [LeetCode解题报告] LCP 49. 环形闯关游戏

    [LeetCode解题报告] LCP 49. 环形闯关游戏 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 四. 参考链接 ...

  5. [LeetCode解题报告] 365. 水壶问题

    [LeetCode解题报告] 365. 水壶问题 一. 题目 1. 题目描述 2. 原题链接 二. 解题报告 1. 思路分析 2. 复杂度分析 3. 代码实现 三. 本题小结 一. 题目 1. 题目描 ...

  6. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  7. 【LeetCode解题报告】《算法基础006_日期算法》- Java

    目录 一.一周中的第几天 1.题目 2.分析 3.代码 二.一年中的第几天 1.题目 2.分析 3.代码 三.日期之间隔几天 1.题目 2.分析 3.代码 一.一周中的第几天 1.题目 1185.一周 ...

  8. 解题报告——试题 基础练习 分解质因数——31行代码AC

    励志用少的代码做高效的表达 储备知识: 1.预处理: 预处理的意思是将可能用到的数据先行处理,形成一张表,如果想要调用某个数,直接去表里查找. 2.筛选法: 筛选法是预处理的一种. 一般用筛选法来求某 ...

  9. leetcode解题报告:188 Best Time to Buy and Sell Stock IV

    问题: 给定一个列表,第i个元素代表股票第i天的价值,最多只允许买入卖出k次,求最大收益 思路:动态规划 输入为列表p1p2...pm 代码:Python 转载于:https://blog.51cto ...

最新文章

  1. mysql中的cache和buffer_mysql Cache和Buffer区别有哪些?
  2. 漫话:如何给女朋友解释为什么不能在 MySQL 中使用 UTF-8 编码
  3. 8.使用hydra对端口进行爆破
  4. 集群(一)——LVS负载均衡集群
  5. python中json模块_Python的标准模块包json的实例用法
  6. D - F e n d 簡 單 教 學 DOSBOX Easy Shell 【玩DOS游戏的必备软件】
  7. NeurIPS 2021揭榜,接收率创九年新高,中了吗中了吗?
  8. 程序员如何通过 Git 来更好地提交消息?
  9. java 序列化 学习
  10. Python基础(十): 函数的基本概念
  11. 190415每日一句
  12. PHP中使用了mcrypt_decrypt函数处理Json Json_decode 返回空值或者 NULL 的问题 json_last_error 3...
  13. 【面试】前端面试人事问题
  14. 自媒体文章如何有效提高原创度?
  15. java前后端分离开发思路
  16. 蓝桥杯 并查集汇总学习 及其代码
  17. C语言-输出一个菱形图。
  18. 关系型数据库Mysql
  19. java x7变速_X7-G500变速键盘的基本原理
  20. TensorFlow2.x 常用知识

热门文章

  1. 小项目-弹幕数据分析+词云展示
  2. javascript中childNodes与children 区别 以及firstChild与firstElementChild区别
  3. vue监听下滑加载(移动端)
  4. 安卓解决输入的时候 背景下滑问题
  5. Python爬虫学习记录(3)——用Python获取虾米加心歌曲,并获取MP3下载地址
  6. c++ primer 第五版 翻译 第一章
  7. Winform 开源控件库( Sheng.Winform.Controls)
  8. C语言版2048小游戏创作思路及代码
  9. c语言10 u0010求余怎么求,矩阵LU分解求逆详细分析与C语言实现.docx
  10. 四. H.264视频编解码器(X264和JM)及参考软件JM的下载与编解码