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/
**







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;
}
Project Euler 21 Distinct primes factors( 整数因子和 )的更多相关文章
- Project Euler 47 Distinct primes factors( 筛法记录不同素因子个数 )
题意: 首次出现连续两个数均有两个不同的质因数是在: 14 = 2 × 715 = 3 × 5 首次出现连续三个数均有三个不同的质因数是在: 644 = 22 × 7 × 23645 = 3 × 5 ...
- Project Euler 23 Non-abundant sums( 整数因子和 )
题意: 完全数是指真因数之和等于自身的那些数.例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数. 一个数n被称为亏数,如果它的真因数之和小于n:反之则被称为 ...
- (Problem 47)Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are: 14 = 2 7 15 = 3 5 The fi ...
- Project Euler:Problem 47 Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are: 14 = 2 × 7 15 = 3 × 5 The ...
- Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )
题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...
- Project Euler 27 Quadratic primes( 米勒测试 + 推导性质 )
题意: 欧拉发现了这个著名的二次多项式: f(n) = n2 + n + 41 对于连续的整数n从0到39,这个二次多项式生成了40个素数.然而,当n = 40时402 + 40 + 41 = 40( ...
- Project Euler 37 Truncatable primes
题意:3797有着奇特的性质.不仅它本身是一个素数,而且如果从左往右逐一截去数字,剩下的仍然都是素数:3797.797.97和7:同样地,如果从右往左逐一截去数字,剩下的也依然都是素数:3797.37 ...
- Project Euler 35 Circular primes
题意:197被称为圆周素数,因为将它逐位旋转所得到的数:197/971和719都是素数.小于100的圆周素数有十三个:2.3.5.7.11.13.17.31.37.71.73.79和97.小于一百万的 ...
- Project Euler 58: Spiral primes
从一开始按以下方式逆时针旋转,可以形成一个边长为七的正方形螺旋: 一个有趣的现象是右下对角线上都有一个奇完全平方数,但是更有趣的是两条对角线上的十三个数中有八个数是素数(已经标红),也就是说素数占比为 ...
随机推荐
- SSH框架下单元测试的实现
SSH框架下单元测试的实现 实现的功能 实现了部门的增删改查 对Action进行了单元测试 对Service 进行了单元测试,通过mock的方式实现. 实现的步骤 一.对Action层的单元测试实现 ...
- DJANGO之自定义模板过滤器
我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.it ...
- HDU 3691
一个源点,一个汇点,明显是网络流的问题,但据说用网络流来求最小割,会超时..囧,那出题的人是怎么想的... 用SW的算法来求最小割. #include <iostream> #includ ...
- Linux 端口 为什么要有端口
ip能锁定一台物理机器,对应着一张网卡,外界发来的数据包网卡都会接收.但是问题来了,网卡给程序提供了接口,你监听一下我,要是有消息来了,我就转发给你.这样应用程序就能收到数据了.但是问题来了,程序A和 ...
- 初识——Vim
有些东西吧,总是碰见,低头不见抬头见,但又不知道是什么.用来干嘛的?总是搞的心里痒痒.所以一定要学习一下. 近期一段时间,总是碰到一个词儿:VIM,在这儿看到了,我不理他,隔一会儿丫的又跑我眼睛里,总 ...
- DNS同时占用UDP和TCP端口53——传输数据超过512时候用tcp,DNS服务器可以配置仅支持UDP查询包
DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况下使用这两种协议. 先简单介绍下TCP与UDP. ...
- hdu 1002(大数)
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 找新朋友(hdoj--1286--欧拉函数)
欢迎参加--每周六晚的BestCoder(有米!) 找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- Python中的traceback模块
traceback模块被用来跟踪异常返回信息. 如下例所示: 1.直接打印异常信息 import traceback try: raise SyntaxError, "traceback t ...
- 排序系列 之 希尔排序算法 —— Java实现
基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...