Java 中的 LCM 总和2024 年 9 月 10 日 | 阅读 8 分钟 输入中会给出一个数字 n。我们的任务是找到从 1 到 n 的数字与数字 N 的 LCM 之和。换句话说,我们需要找到 lcm(1, n) + lcm(2, n) + lcm(3, n) + … + lcm(n, n) 的值。 示例 1 输入 int n = 6 输出 66 解释: lcm(1, 6) + lcm(2, 6) + lcm(3, 6) + lcm(4, 6) + lcm(5, 6) + lcm(6, 6) 的值为 6 + 6 + 6 + 12 + 30 + 6 = 66 示例 2 输入 int n = 3 输出 12 解释: lcm(1, 3) + lcm(2, 3) + lcm(3, 3) 的值为 3 + 6 + 3 = 12 简单方法简单的方法是运行一个循环,并为每对数字计算 LCM。两个数字 p 和 q(假设)的 LCM 可以通过一个从 p 和 q 的最大值运行到 p x q 的循环来找到。在每次迭代中,我们需要检查循环变量所指向的值是否能被 p 和 q 整除。如果可以,我们可以使用 break 语句终止循环,该值就是 p 和 q 的 LCM。否则,循环将继续。请观察以下程序。 文件名: LCMSum.java 输出 The sum of LCM of numbers for the input number: 6 is 66 The sum of LCM of numbers for the input number: 3 is 12 复杂度分析: 存在一个从 1 到 n 的循环,需要 O(n) 的时间。在每次迭代中,我们调用 findLCM() 方法,该方法需要 O(a * n) 的时间,其中 a 从 1 运行到 n。因此,程序的总时间复杂度为 O(a * n2),其中 n 是输入数字。程序空间复杂度为 O(1)。 现在,让我们通过一些优化来降低程序的时域复杂度。 方法:使用数学公式两个自然数 p 和 q 的乘积的基本数学公式为: p x q = HCF(p, q) x LCM(p, q)。因此,LCM(p, q) = (p x q) / HCF(p, q)。数字 p 和 q 已经已知。唯一需要找到的是 HCF(最高公因子)。HCF 可以通过一个从 min(p, q) 运行到 1 的循环来找到。如果循环变量所指向的值能同时整除两个数字,那么该值就是我们的 HCF,我们可以终止循环。之后,找到 LCM(p, q) 就很简单了。 找到 HCF 的另一种方法是欧几里得算法。我们将实现这两种方法来查找 HCF,并最终查找 LCM。请看以下程序。 文件名: LCMSum1.java 输出 The sum of LCM of numbers for the input number: 6 is 66 The sum of LCM of numbers for the input number: 3 is 12 复杂度分析: 第 60 行调用的方法决定了程序的时间复杂度。在程序中,调用了 findLCMUsingEuclidean() 方法(在第 60 行)。findLCMUsingEuclidean() 方法的时间复杂度为 O(log(min(a, n))),其中 a 的范围从 1 到 n。另外,该方法被调用了 n 次。因此,程序的总时间复杂度为 O(n x log(min(a, n)))。如果我们使用 findLCMUsingMethod() 方法(在第 60 行),则该方法消耗的时间为 O(min(a, n))。程序的总时间复杂度为 O(n x log(min(a, n))),其中 n 是输入数字。 方法:使用欧拉函数(欧拉函数)我们将使用欧拉函数方法来解决问题。 输入为 'p' 的欧拉函数 Φ(p) 是列表中 {1, 2, 3, …, p} 中与 p 互质的数字的数量。换句话说,这些数字与 p 的 HCF(最高公因子)等于 1。下面给出了一些例子。 示例 1 Φ(1) = 1 gcd(1, 1) 为 1 示例 2 Φ(4) = 2 gcd(1, 4) 为 1,gcd(3, 4) 为 1 示例 3 Φ(7) = 6 gcd(1, 7) 为 1,gcd(2, 7) 为 1, gcd(3, 7) 为 1,gcd(4, 7) 为 1 gcd(5, 7) 为 1,gcd(6, 7) 为 1 示例 4 Φ(8) = 4 gcd(1, 8) 为 1,gcd(3, 8) 为 1 gcd(5, 8) 为 1,gcd(7, 8) 为 1 要计算 Φ (p),可以使用两种方法: 1) 使用 HCF 运行一个从 1 到 p 的循环,并检查每个数字与 p 的 HCF。每当 HCF 为 1 时,就可以递增该值。另一种方法是使用欧拉公式 2) 使用欧拉乘积公式 该公式表明 Φ(p) 的值等于 p 乘以 (1 - 1/t) 的乘积,其中 t 是 N 的所有素数因子。例如, Φ(12) = 12 * (1 - 1 / 2) * (1 - 1 / 3) = 4。请注意,2 和 3 是 12 的素数因子。 在计算了每个数字的 ETF(欧拉函数)后,我们可以使用以下欧拉函数 LCM 和公式: ∑LCM(a, p) = ((∑(div * ETF(div)) + 1) * p) / 2 其中 ETF(div) 是 div 的欧拉函数,div 是 p 的除数集合。 让我们通过一个例子来验证。 示例∑LCM(a, p) = LCM(1, 6) + LCM(2, 6) + LCM(3, 6) + LCM(4, 6) + LCM(5, 6) + LCM(6, 6) = 6 + 6 + 6 + 12 + 30 + 6 = 66,其中 a = 1,p = 6 现在,让我们使用欧拉函数: 6 的所有除数是:{1, 2, 3, 6} 因此,((1 x ETF(1) + 2 x ETF(2) + 3 x ETF(3) + 6 x ETF(6) + 1) * 6) / 2 = ((1 + 2 + 6 + 12 + 1) x 6) / 2 = 132 / 2 = 66 我们得到了相同的结果。现在是实现部分。 文件名: LCMSum2.java 输出 The sum of LCM of numbers for the input number: 6 is 66 The sum of LCM of numbers for the input number: 3 is 12 复杂度分析: 查找数字 n 的因子需要 log(log(n)) 的时间,并且我们正在查找 n 个数字的因子。因此,程序的总时间复杂度为 O(n x log(log(n))),其中 n 是输入数字。 下一个主题Java 中的波浪号运算符 |
java.lang.reflect.Field 类有一个 get() 方法,用于检索字段对象的值。当字段是原始类型时,对象会自动包装其值。如果字段是静态的,则会忽略 obj 参数;它可以为 null。在...
阅读 4 分钟
每个局部变量和最终空白字段在访问任何值时都会具有赋给它的值。值访问将包括变量的名称或表达式中出现的区域,除了赋值运算符 "=" 的左侧操作数。要...
阅读 15 分钟
在 Java 中,内存管理和垃圾回收是维持最佳性能和避免内存泄漏的关键方面。与 Java 的垃圾回收机制相关的有趣概念是孤岛。这个术语指的是一组相互引用但...
阅读 4 分钟
Java 是一种多功能且广泛使用的编程语言,以其健壮性和平台独立性而闻名。它提供了各种操作字符串的方法,其中一项强大功能是字符串插值。字符串插值允许我们将变量和表达式直接嵌入到字符串中……
阅读 4 分钟
为了实现并行,Java 开发人员有时必须在多进程和多线程之间做出决定。这两种方法都有优点和缺点,因此了解它们之间的区别可以帮助我们为特定需求选择最佳方法。Java 中的多线程 划分过程...
阅读 3 分钟
Java 字节码是 JVM 理解的 Java 代码指令集。Java 程序编译后,会为其代码生成字节码。简单来说,Java 字节码就是 .class 文件形式的机器码。用...
5 分钟阅读
在 Java 中,JAR 是 Java ARchive 的缩写,其格式基于 zip 格式。JAR 文件格式主要用于将一组文件聚合到一个文件中。它是一种单一的跨平台存档格式,可以处理图像、音频和类文件...
阅读 2 分钟
在 Java 编程语言中,接口是一种引用类型。接口类似于类。它只能包含常量、方法签名、默认方法、静态方法、嵌套类型和私有方法(Java 9 中引入)。只有默认方法和静态方法才有方法体...
5 分钟阅读
在 Java 中,final 是一个关键字,它确保原始类型、方法、变量类等的不可变性。它被视为不可访问的修饰符。如果我们想使用 final 关键字,我们必须在变量、方法和类之前指定它。它限制我们访问...
阅读 3 分钟
在 Java 中,最常见的搜索程序是搜索员工详细信息。员工是一个实体,可以有几个属性,如 id、name 和 department 等。为了创建一个 Java 员工详细信息程序,我们需要为员工实体创建一个类,并...
阅读 2 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India