Project Euler 21 Distinct primes factors( 整数因子和 )


题意:
记d(n)为n的所有真因数(小于n且整除n的正整数)之和。
如果d(a) = b且d(b) = a,且a ≠ b,那么a和b构成一个亲和数对,a和b被称为亲和数。

例如,220的真因数包括1、2、4、5、10、11、20、22、44、55和100,因此d(220) = 284;而284的真因数包括1、2、4、71和142,因此d(284) = 220。

求所有小于10000的亲和数的和。

整数因子和:

<font color = red , size = 5 >以下图片仅供学习!图片来源为海贼科技:

http://www.haizeix.com/

o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-15-57.815Z.png
o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-16-11.466Z.png
o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-16-22.225Z.png
o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-16-35.071Z.png
o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-16-46.621Z.png
o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-17-00.445Z.png
o_%e7%81%ab%e7%8b%90%e6%88%aa%e5%9b%be_2017-06-30T10-17-12.626Z.png


My Code :

/*************************************************************************
    > File Name: euler021.c
    > Author:    WArobot 
    > Blog:      http://www.cnblogs.com/WArobot/ 
    > Created Time: 2017年06月30日 星期五 16时47分13秒
 ************************************************************************/

#include <stdio.h>
#include <inttypes.h>

#define MAX_RANGE 10000

int32_t isPrime[MAX_RANGE + 10] = {0};      // 存放数字i的最小素因子幂次项,例如isPrime[24] = 8 
int32_t prime[MAX_RANGE + 10] = {0};        // 素数表
int32_t d[MAX_RANGE + 10] = {0};            // 存放数字i约数的和

void Init() {
    for (int32_t i = 2 ; i <= MAX_RANGE ; i++) {
        if (!isPrime[i]) {
            isPrime[i] = i;
            d[i] = i + 1;
            prime[++prime[0]] = i;
        }
        for (int32_t j = 1 ; j <= prime[0] ; j++) {
            if (i * prime[j] > MAX_RANGE)   break;
            if (i % prime[j] == 0) {        // 如果prime[j]是i的最小素因子,那么就相当于在原来的基础上增加了一个最小的素因子,所以得改变原来的d[]
                isPrime[i * prime[j]] = isPrime[i] * prime[j];  
                d[i * prime[j]] = d[i] * (isPrime[i] * prime[j] * prime[j] - 1) / (isPrime[i] * prime[j] - 1);  // 更改最小素因子等比序列和
                break;
            } else {
                isPrime[i * prime[j]] = prime[j];       // 因为prime[j]比i的最小素因子还小(线性筛原理),所以更新i * prime[j] 的最小素因子为prime[j] 
                d[i * prime[j]] = d[i] * d[prime[j]];   // i 和 prime[j]互素所以可以用约数和定理:若正整数A、B互素 C = A*B 则有F(C) = F(A) * F(B)(F(x)为x的约数和)
            }
        }
    }
}
int32_t main() {
    Init();
    for (int32_t i = 1 ; i <= MAX_RANGE ; i++) {
        d[i] -= i;      // 并不包含自身
    }
    int32_t sum = 0;
    printf("d[220] = %d\n",d[220]);
    printf("d[284] = %d\n",d[284]);
    for (int32_t i = 1 ; i <= MAX_RANGE ; i++) {
        if (d[i] > MAX_RANGE)   continue;
        if (d[d[i]] == i && d[i] != i) {    // 注意题目中要求 d(a) = b,d(b) = a,a!=b 
            sum += i;
        }
    }
    printf("%d\n",sum);
    return 0;
}

转载于:https://www.cnblogs.com/WArobot/p/7100203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenEuler是华为推出的国产Linux操作系统,而Linux是一种开源的类Unix操作系统。它们之间有以下几点区别和联系: 1. 开发者和维护者:OpenEuler由华为负责开发和维护,而Linux是由全球的开源社区共同开发和维护。 2. 发行版本:OpenEuler是一种特定的Linux发行版本,它基于Linux内核,并在此基础上进行了定制和优化。而Linux是一个广义的概念,包括了许多不同的发行版本,如Ubuntu、CentOS、Debian等。 3. 定位和目标用户:OpenEuler主要面向企业级用户,特别是云计算和大数据领域。它提供了一系列针对企业需求的功能和特性。而Linux则广泛应用于各个领域,包括个人电脑、服务器、嵌入式设备等。 4. 社区支持:OpenEuler拥有自己的开发者社区,用户可以在社区中获取技术支持、参与开发和贡献代码。而Linux拥有庞大的全球开源社区,用户可以在各种社区中获取支持和参与开发。 5. 工具和软件生态系统:OpenEuler和Linux都有丰富的工具和软件生态系统,用户可以在其上运行各种应用程序和服务。由于OpenEuler基于Linux内核,因此大部分Linux上的工具和软件也可以在OpenEuler上运行。 总结来说,OpenEuler是一种特定的Linux发行版本,它由华为开发和维护,主要面向企业级用户。它在功能和特性上进行了定制和优化,同时也可以享受到Linux广泛的工具和软件生态系统的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值