用c语言解决下列问题:亲密数_2 2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系: 220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284 284的真因数之和为:1+2+4+71+142=220 毕达哥拉斯把这样的数对称为相亲数。相亲数,也称为亲密数,如果整数a的全部因子(包括1,不包括a本身)之和等于b,且整数b的全部因子(包括1,不包括b本身)之和等于a,则将整数a和b称为亲密数。 从键盘任意输入一个整数n,编程计算并输出n以内的全部亲密数。 一对亲密数只输出一次, 小的在前。 程序运行示例1 Input n: 3000↙ (220,284) (1184,1210) (2620,2924) 程序运行示例2 Input n: 1000↙ (220,284) 输入格式: "%d" 输出格式: 输入提示信息:"Input n:\n" 输出格式: "(%d,%d)\n"
时间: 2024-02-12 09:05:06 浏览: 145
C语言程序设计-计算并输出给定整数n的所有因子之和(不包括1与自身);注意:n的值不大于1000.c
5星 · 资源好评率100%
以下是用C语言解决该问题的代码:
```c
#include <stdio.h>
int sum_of_divisors(int num);
int main() {
int n, i, j, sum_i, sum_j;
printf("Input n:\n");
scanf("%d", &n);
printf("亲密数有:\n");
for (i = 1; i <= n; i++) {
sum_i = sum_of_divisors(i);
if (sum_i > i && sum_i <= n) { // 只需要找比i大并且不超过n的数
sum_j = sum_of_divisors(sum_i);
if (sum_j == i) {
printf("(%d,%d)\n", i, sum_i);
}
}
}
return 0;
}
int sum_of_divisors(int num) {
int i, sum = 1;
for (i = 2; i * i <= num; i++) {
if (num % i == 0) {
sum += i;
if (i * i != num) { // 避免重复计算平方因子
sum += num / i;
}
}
}
return sum;
}
```
程序的思路是:对于1到n之间的每一个数i,计算它的真因数之和sum_i,如果sum_i比i大并且不超过n,则继续计算sum_i的真因数之和sum_j,如果sum_j等于i,则输出一对亲密数(i, sum_i)。为了避免重复计算,只需要找比i大并且不超过n的数。
阅读全文