求解亲密数代码剖析

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

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一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
124 0
|
6月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
115 0
|
6月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
6月前
|
存储 算法
算法题解-组合总和3
算法题解-组合总和3
|
6月前
|
算法 测试技术 C#
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
【数学】LeetCode1526: 形成目标数组的子数组最少增加次数
|
C++
数的分解
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
75 0
|
算法 C++
C++ 只用一行代码就能计算斐波那契数列!
C++ 只用一行代码就能计算斐波那契数列!
105 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)在区间内可导。
3928 1