鱼C论坛

 找回密码
 立即注册
查看: 158|回复: 2

C语言亲密数求教!!!

[复制链接]
发表于 2024-5-28 08:50:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

问题描述】给出一个数,寻找小于这个数的所有亲密数对。
【输入形式】

【输出形式】
【样例输入】

300
【样例输出】

220 284
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-28 08:50:58 | 显示全部楼层
亲密数是指两个正整数中,第一个数的所有真因子之和等于第二个数,而且第二个数的所有真因子之和等于第一个数。例如,220的所有真因子(除了其本身)是1、2、4、5、10、11、20、22、44、55和110,它们的和是284。而284的所有真因子是1、2、4、71和142,它们的和是220。

要求小于给定数的所有亲密数对,我们可以先写一个函数来计算一个数的真因子之和,然后遍历给定数以下的每一个数,判断它是否有对应的亲密数对。

下面是完整的代码实现:
#include <stdio.h>

// 计算一个数的真因子之和
int sumOfProperDivisors(int num) {
    int sum = 1;
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            sum += i;
            if (i * i != num) {
                sum += num / i;
            }
        }
    }
    return sum;
}

int main() {
    int n;
    printf("请输入一个正整数:");
    scanf("%d", &n);

    printf("%d以下的亲密数对有:\n", n);
    for (int i = 1; i < n; i++) {
        int sum1 = sumOfProperDivisors(i);
        int sum2 = sumOfProperDivisors(sum1);
        if (sum2 == i && sum1 != i) {
            printf("%d %d\n", i, sum1);
        }
    }

    return 0;
}

以上的代码中,`sumOfProperDivisors`函数用来计算一个数的真因子之和。注意,在计算真因子之和时只需要遍历到平方根即可,这样可以节省很多时间。在主函数中,我们按顺序遍历小于给定数的每一个数,判断它是否有亲密数对,并打印出来。

希望能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-28 13:50:24 | 显示全部楼层
本帖最后由 jackz007 于 2024-5-28 14:36 编辑
#include <stdio.h>

/* 如果一个正整数 d 除本身 (d) 以外的所有因数之和为 e ,而 e
   除本身 (e) 以外的所有因数之和为 d,那么,称 d、e 为亲密数。*/

int foo(int d)
{
        int e , k                                              ;
        for(k = 1 , e = 2 ; e < d ; e ++) if(! (d % e)) k += e ;
        return k                                               ;
}

int main(void)
{
        int c , d , e , n                                      ;
        scanf("%d" , & n)                                      ;
        for(c = 0 , d = 2 ; d <= n ; d ++) {
                e = foo(d)                                     ;
                if(d > e && foo(e) == d) {
                        printf("%d %d\n" , e , d)              ;
                        c ++                                   ;
                }
        }
        if(! c) printf("not found.\n")                         ;
}
        编译、运行实况:
D:\[exercise]\C>g++ -o x x.c

D:\[exercise]\C>x
300
220 284

D:\[exercise]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-27 10:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表