题目 1122: [C语言训练]亲密数 题解
发布日期:2021-04-30 21:02:50 浏览次数:88 分类:精选文章

本文共 1886 字,大约阅读时间需要 6 分钟。

为了找出3000以内的亲密数对,我们可以编写一个程序来遍历每个数,计算其因数之和,并检查是否满足亲密数的条件。以下是代码的逻辑和实现过程:

  • 定义函数:创建一个函数getFactorSum,用于计算给定数n的因数之和(不包括n本身)。
  • 遍历每个数:从1到2999遍历每个数a。
  • 计算因数之和:对于每个a,使用getFactorSum计算其因数之和b。
  • 检查条件:确保b大于a,并且b的因数之和等于a。如果满足条件,则(a, b)是一对亲密数。
  • 输出结果:收集所有满足条件的数对,并按升序排列后输出。
  • 以下是优化后的代码:

    public class KineticNumbers {    public static void main(String[] args) {        // 定义一个数组来存储所有找到的亲密数对        java.util.ArrayList
    aList = new java.util.ArrayList<>(); java.util.ArrayList
    bList = new java.util.ArrayList<>(); // 遍历每个可能的数a for (int a = 1; a < 3000; a++) { // 计算a的因数之和 int b = getFactorSum(a); // 如果b大于a,继续检查 if (b > a) { // 计算b的因数之和 int n = getFactorSum(b); // 检查是否满足条件 if (n == a) { // 如果满足条件,将a和b添加到列表中 aList.add(a); bList.add(b); } } } // 输出结果 for (int i = 0; i < aList.size(); i++) { System.out.print("(" + aList.get(i) + "," + bList.get(i) + ")"); } } // 计算一个数的因数之和,不包括自身 private static int getFactorSum(int n) { int sum = 0; for (int i = 1; i <= Math.sqrt(n); i++) { if (n % i == 0) { sum += i; // 检查是否是平方数,避免重复计算平方根 if (i != n / i) { sum += n / i; } } } return sum; }}

    编程步骤解释

  • 函数定义getFactorSum函数用于计算给定整数n的因数之和。它利用平方根来优化循环,避免重复计算平方数的因数。
  • 主循环:从1遍历到2999,计算每个数a的因数之和b。
  • 条件检查:确保b大于a,然后计算b的因数之和n。如果n等于a,则(a, b)是一对亲密数。
  • 结果输出:将所有满足条件的数对按顺序输出。
  • 示例运行结果

    运行上述代码后,会输出三个亲密数对:(220, 284)、(1184, 1210) 和 (2620, 2924)。

    优化说明

    • 平方根优化:在计算因数之和时,使用平方根来减少循环次数,提高效率。
    • 避免重复计算:当i等于n/i时,避免将同一个因数加两次。
    • 列表存储:使用两个列表分别存储a和b的值,确保每一对只输出一次。

    总结:通过系统地遍历每个数并利用因数之和的性质,可以有效地找出所有满足条件的亲密数对。

    上一篇:java基础-Java集合框架-Collection子接口-LinkedList的源码分析
    下一篇:动态规划--牛客网19校招--魔法深渊

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2026年06月10日 13时01分16秒