目录😋
任务描述
本关任务:通过函数实现打印3000以内的全部亲密数。
相关知识
为了完成本关任务,你需要掌握:
- 循环控制 / 跳转语句的使用
- 亲密数的概念
- 判断亲密数的方法
一、循环控制 / 跳转语句的使用
1. 循环控制语句(for 循环)
- 基本原理:
for
循环是一种常用的循环结构,它允许您指定一个初始化表达式、一个循环条件和一个更新表达式。语法格式为for(初始化表达式; 循环条件; 更新表达式)
。初始化表达式在循环开始时执行一次,用于初始化循环变量。循环条件在每次循环迭代开始时进行检查,如果为真,则执行循环体中的代码。更新表达式在每次循环体执行完后执行,用于更新循环变量。- 示例代码
int main() { // 打印1到10的数字 for (int i = 1; i <= 10; i++) { printf("%d ", i); } printf("\n"); return 0; }
2. 循环控制语句(while 循环)
- 基本原理:
while
循环在循环开始时检查循环条件。只要条件为真,就会执行循环体中的代码。语法格式为while(循环条件)
。循环条件是一个表达式,它返回一个布尔值(真或假)。在循环体中,通常需要包含一些能够改变循环条件的语句,否则可能会导致无限循环。- 示例代码
int main() { int i = 1; while (i <= 10) { printf("%d ", i); i++; } printf("\n"); return 0; }
3. 跳转语句(break 语句)
- 基本原理:
break
语句用于立即跳出当前循环(for
、while
、do - while
)或switch
语句。当程序执行到break
语句时,循环或switch
语句会立即终止,程序控制流将跳转到循环或switch
语句后的下一条语句。- 示例代码(在循环中使用 break)
int main() { for (int i = 1; i <= 10; i++) { if (i == 5) { break; } printf("%d ", i); } printf("\n"); return 0; }
4. 跳转语句(continue 语句)
- 基本原理:
continue
语句用于跳过当前循环迭代的剩余部分,直接开始下一次循环迭代。当程序执行到continue
语句时,循环体中continue
语句之后的代码将不会被执行,而是直接跳转到循环的更新表达式(对于for
循环)或循环条件检查(对于while
和do - while
循环)。- 示例代码(在循环中使用 continue)
int main() { for (int i = 1; i <= 10; i++) { if (i == 5) { continue; } printf("%d ", i); } printf("\n"); return 0; }
二、亲密数的概念
1. 定义
亲密数是针对两个不同的自然数而言的一种特殊关系描述。具体来说,对于自然数 A 和 B,假如整数 A 的所有因子(这里的因子包含 1,但不包含 A 本身)相加所得的和恰好等于 B;同时,整数 B 的所有因子(同样包含 1,不包含 B 本身)相加的和又等于 A,那么我们就把这两个整数 A 和 B 称作亲密数。
2. 举例说明
我们以数字 220 和 284 为例来直观理解亲密数的定义:
- 对于 220 来说,它的因子有 1、2、4、5、10、11、20、22、44、55、110 这些数(找因子的方法就是看哪些自然数能够整除 220),把这些因子相加起来:1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 。
- 再看 284 ,它的因子有 1、2、4、71、142 ,把这些因子相加可得:1 + 2 + 4 + 71 + 142 = 220 。
这两个数正好满足上述亲密数定义中 A 的因子和等于 B ,B 的因子和等于 A 的这种相互关系,所以 220 和 284 就是一对亲密数。
3. 历史背景(延伸内容)
亲密数的概念可以追溯到古代数学。古希腊数学家毕达哥拉斯及其学派对于数的性质有着深入的研究,他们对数之间的各种关系很感兴趣,亲密数就是其中一种有趣的关系发现。这种数的关系在当时的数学研究以及哲学思考中都有一定的意义,因为古希腊人认为数具有神秘的性质,像亲密数这样的关系可能被用于解释自然现象或者哲学理念等诸多方面。 编辑
三、判断亲密数的方法
判断两个数是否为亲密数,通常可以按照以下步骤来进行:
1. 计算数 A 的各因子,并求其和存于 B
- 找出自然数 A 的所有因子(除了 A 本身以外)。比如我们要判断两个数是否是亲密数,先确定其中一个数为 A,然后从 1 开始依次判断每个小于 A 的自然数能否整除 A,如果能整除,那么这个自然数就是 A 的因子。把所有找到的因子相加,得到的和记为 B 。
- 例如,还是以 220 作为 A 来举例,我们通过依次判断发现 1 能整除 220,2 也能整除 220,4 同样能整除 220…… 一直到找到所有符合条件的因子 1、2、4、5、10、11、20、22、44、55、110 ,将它们相加得到 284 存于 B 。
2. 计算 B 的各因子,并求其和存于 sum
- 把上一步得到的 B 当作新的数,再按照找因子的方法,找出 B 的所有因子(除 B 本身以外)。同样从 1 开始,依次判断每个小于 B 的自然数能否整除 B ,能整除的就是 B 的因子。然后把这些因子全部相加,得到的和记为 sum 。
- 例如,对于前面得到的 B = 284 ,我们找出它的因子 1、2、4、71、142 ,将它们相加:1 + 2 + 4 + 71 + 142 = 220 ,这里得到的和 220 就存为 sum 。
3. 比较 sum 和 A 是否相等
- 最后,把得到的 sum 和最初的那个自然数 A 进行比较,如果 sum 与 A 相等,那就说明这两个数 A 和 B 是亲密数;如果 sum 与 A 不相等,那就表明它们不是亲密数。
- 例如,像前面例子中,最初的 A 是 220 ,最后计算得到的 sum 也是 220 ,二者相等,所以可以确定 220 和 284 是亲密数。
编程要求
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。
测试说明
平台会对你编写的代码进行测试:
预期输出:
220和284是一组亲密数
预期输出:
1184和1210是一组亲密数
预期输出:
2620和2924是一组亲密数
开始你的任务吧,祝你成功!
通关代码
int sum_of_factors(int num) { int sum = 0; for (int i = 1; i < num; i++) { if (num % i == 0) { sum += i; } } return sum; } int is(int i) { int j, n, sum1, sum2; //请在此添加代码 /*********Begin*********/ sum1 = sum_of_factors(i); sum2 = sum_of_factors(sum1); /********* End *********/ if (sum2 == i && i < sum1) return sum1; else return 0; } int main() { int i, j; //请在此添加代码 /*********Begin*********/ for (i = 1; i <= N; i++) { j = is(i); if (j > 0) { /********* End *********/ printf("%d和%d是一组亲密数\n", i, j); } } }
测试结果