求解亲密数代码剖析

简介: 求解亲密数代码剖析

C语言学习过一段时间后,相信大家一定都见过这样一道题---求解亲密数

方法呢大致分为两种

1.调用自定义函数(这个方法易于理解,但不建议使用,因为耗时过长)

#include <stdio.h>
int Sum(int a)
{
  int sum = 0;
  for (int i = 1; i < a; i++)
  {
    if (a % i == 0)
      sum += i;
  }
  return sum;
}
int main()
{
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++)
  {
    for (int j = 2; j <= n; j++)
    {
      if (Sum(i) == j && Sum(j) == i && i < Sum(i))
        printf("%d %d\n", i, j);
    }
  }
  return 0;
}

这里是自定义了一个求因数和的函数,不建议使用的原因是,它会重复计算大量数据,从而消耗大量时间,不过这个算法却容易理解

2.

#include <stdio.h>
int main()
{
  int n, i, j, k, sum1, sum2;
  scanf("%d", &n);
  for (i = 1; i <= n; i++)
  {
    sum1 = 0;
    sum2 = 0;
    for (j = 1; j < i; j++)
    {
      if (i % j == 0)
        sum1 += j;
    }
    for (k = 1; k < sum1; k++)
    {
      if (sum1 % k == 0)
        sum2 += k;
    }
      if (sum2 == i && i < sum1)
        printf("%d %d\n", i, sum1);
  }
  return 0;
}

第二种方法则使用到了三个for循环,这种方法简单且运行时间快,但中间不容易理解

第一个for循环遍历所有的n个数,第二个for循环则是求第一个for循环所遍历的数的所有因数并求和,第三个for循环则是遍历sum1-1个数,但到这我想有的人会不理解为什么要遍历sum1-1以内的数,这也正是这个代码精妙的地方,因为这一步其实同时满足了题目的一个条件即A的因数之和等于B,接下来求完sum2后只需要另B的因数之和等于A即可。

但这种方法有个极容易忽视的问题即对于sum1,sum2的初始化一定要放在for循环里面,否则不会输出任何数,因为如果放在for循环外面则执行完一整套循环后,sum的值不会被初始化

相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
|
6月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
127 0
|
6月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
120 0
|
5月前
|
算法 数据挖掘 大数据
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
|
6月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
C++
数的分解
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
79 0
L2-018 多项式A除以B (25 分)(数组模拟)
L2-018 多项式A除以B (25 分)(数组模拟)
175 0
L2-018 多项式A除以B (25 分)(数组模拟)
如何用牛顿法求一个数的平方根
(一)导数与导函数 导数 设函数y=f(x)在点x0的某个邻域内有定义,当自变量x在x0处有增量Δx,(x0+Δx)也在该邻域内时,相应地函数取得增量Δy=f(x0+Δx)-f(x0);如果Δy与Δx之比当Δx→0时极限存在,则称函数y=f(x)在点x0处可导,并称这个极限为函数y=f(x)在点x0处的导数记作①f'(x0) ;②y'│x=x0 ;③ │x=x0, 即 导函数 如果函数y=f(x)在开区间内每一点都可导,就称函数f(x)在区间内可导。
3941 1
|
Java
如何计算线程数的最优值?——咱有公式
如何计算线程数的最优值?——咱有公式
224 0
如何计算线程数的最优值?——咱有公式
|
测试技术
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
软件测试面试题:如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。 例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加, 1+2+3=6。第二个完全
464 0