青训营X豆包MarsCode 技术训练17题 | 豆包MarsCode AI刷题

43 阅读3分钟

#青训营笔记创作活动

image.png

一、处理逻辑

首先,解析这道题,input:[a,b,c,d];

如果可以写成:[pq,pp,sq,sdd]

则最终可以转换为:[[p的3次,q的2次,s的2次,d的2次]](这里p、q、s、d都是素数)

因此这道题的解决方法就是:①分解每个数的素因子;②检查所有素因子的个数;③判断素因子的个数是否小于等于数组长度,如果是,则可以。

二、寻找素因子的数学原理

在寻找一个数的素因子时:

1.任何正整数都可以唯一地被分解成若干个素数的乘积。

这个定理是数论中的基本定理之一,被称为算术基本定理。

可以这么理解:这个数有两种情况:①素数,则不用分解;②合数,则根据概念,合数就是除了自身和1之外还有其他因子,所以它一定可以分解成其他因子。

这些因子又进入上面判断,如果是素数就结束,如果是合数就又可以这样分解下去,直到两个都是素数。结局就是唯一地被分解成若干个素数的乘积。

2.考虑关于一个大于1的正整数i,可以写成 i=a*b,我说这两个数其中一定存在一个数<=i。

3.就是对i进行素因子分解,如果是它的素因子,则有且只能有一个。

这一点我们可以由反证法证明:如果存在两个大于的数是i的素因子则这两个数相乘之后一定大于i本身。

所以,我们可以直接从2开始一直整除目标数i,值记为a,迭代更新a;2整除到不能再除时换下一个素数继续除,但是有个问题就是在写代码时没有一个素数序列,这个时候我们这么解决:

采用奇数序列,2之后也就是3,然后是5、7,接着是9,这个时候我们注意,这个时候b一定不能被9整除,因为所有可以被9整除的数都可以被3整除,也就是虽然用奇数序列,但是奇数序列里面的合数不可能起作用,因为这个奇数序列里面的合数(比如9)的因子一定比本身小,所以目标数已经被提前处理过。

直到处理到,就结束。

三、java代码展示

代码功能

这段代码判断一个整数数组 a 中的所有元素的质因数是否最多有 a.length 个不同的质因数。如果是,则返回 "Yes",否则返回 "No"。

代码结构

  1. solution 方法

    • 输入:整数 n 和整数数组 a
    • 逻辑:
      • 使用 HashSet 存储所有元素的质因数。
      • 遍历数组 a,对每个元素调用 primeFactors 方法获取其质因数,并将其加入 HashSet
      • 如果 HashSet 的大小小于等于 a.length,返回 "Yes";否则返回 "No"。
  2. primeFactors 方法

    • 输入:整数 n
    • 逻辑:
      • 使用 ArrayList 存储 n 的质因数。
      • 先处理所有的偶数因子(2)。
      • 再处理所有的奇数因子,从 3 开始,每次增加 2。
      • 最后处理剩余的可能的质数。
      • 返回质因数列表。