题意:

完全数是指真因数之和等于自身的那些数。例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数。

一个数n被称为亏数,如果它的真因数之和小于n;反之则被称为盈数。

由于12是最小的盈数,它的真因数之和为1 + 2 + 3 + 4 + 6 = 16,所以最小的能够表示成两个盈数之和的数是24。通过数学分析可以得出,所有大于28123的数都可以被写成两个盈数的和;尽管我们知道最大的不能被写成两个盈数的和的数要小于这个值,但这是通过分析所能得到的最好上界。

找出所有不能被写成两个盈数之和的正整数,并求它们的和。

思路:此题与欧拉21题相似


  1. /*************************************************************************
  2. > File Name: euler023.c
  3. > Author: WArobot
  4. > Blog: http://www.cnblogs.com/WArobot/
  5. > Created Time: 2017年06月30日 星期五 19时30分05秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <inttypes.h>
  9. #define MAX_N 28123
  10. int32_t isPrime[MAX_N + 10] = {0}; // 记录最小素数幂次方isPrime[24] = 8 (2^3)
  11. int32_t prime[MAX_N + 10] = {0}; // 记录素数
  12. int32_t d[MAX_N + 10] = {0}; // 记录整数分解约数和
  13. int32_t abundantSum[MAX_N + 10] = {0};
  14. int32_t vis[MAX_N + 10] = {0};
  15. void Init() {
  16. for (int32_t i = 2 ; i <= MAX_N ; i++) {
  17. if (!isPrime[i]) {
  18. isPrime[i] = i;
  19. prime[++prime[0]] = i;
  20. d[i] = i + 1;
  21. }
  22. for (int32_t j = 1 ; j <= prime[0] ; j++) {
  23. if (i * prime[j] > MAX_N) break;
  24. if (i % prime[j] != 0) { // 在prime[j]还小于i的最小素因子时
  25. isPrime[i * prime[j]] = prime[j];
  26. d[i * prime[j]] = d[i] * d[prime[j]];
  27. } else {
  28. isPrime[i * prime[j]] = isPrime[i] * prime[j];
  29. d[i * prime[j]] = d[i] * (isPrime[i] * prime[j] * prime[j] - 1) / (isPrime[i] * prime[j] - 1);
  30. break;
  31. }
  32. }
  33. }
  34. for (int32_t i = 1 ; i <= MAX_N ; i++) {
  35. d[i] -= i;
  36. if (d[i] <= i) continue;
  37. abundantSum[++abundantSum[0]] = i;
  38. }
  39. for (int32_t i = 1 ; i < abundantSum[0] ; i++) {
  40. for (int32_t j = i + 1 ; j <= abundantSum[0] ; j++) {
  41. if (abundantSum[i] + abundantSum[j] > MAX_N) continue;
  42. vis[abundantSum[i] + abundantSum[j]] = 1;
  43. }
  44. }
  45. }
  46. int32_t main() {
  47. Init();
  48. int32_t sum = 0;
  49. for (int32_t i = 1 ; i <= MAX_N ; i++) {
  50. if (vis[i]) continue;
  51. sum += i;
  52. }
  53. printf("%d\n",sum);
  54. return 0;
  55. }

Project Euler 23 Non-abundant sums( 整数因子和 )的更多相关文章

  1. Project Euler P105:Special subset sums: testing 特殊的子集和 检验

    Special subset sums: testing Let S(A) represent the sum of elements in set A of size n. We shall cal ...

  2. Python练习题 040:Project Euler 012:有超过500个因子的三角形数

    本题来自 Project Euler 第12题:https://projecteuler.net/problem=12 # Project Euler: Problem 12: Highly divi ...

  3. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  4. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  5. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

  6. Python练习题 045:Project Euler 017:数字英文表达的字符数累加

    本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...

  7. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  8. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  9. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

随机推荐

  1. Python学习-生成器 - Generator

    简单来说,generator是一个能够返回迭代器对象的函数. yield的使用: 在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器,它的执行会和其他普通的函数有很多 ...

  2. System v和posix的IPC对比

    之前有一篇关于共享内存的System V和Posix的对比: http://www.cnblogs.com/charlesblc/p/6261469.html POSIX(Portable Opera ...

  3. HDU 4513 manacher

    Manacher算法,相当于求回文串. 关于Manacher,转 http://blog.sina.com.cn/s/blog_70811e1a01014esn.html 现在进入正题:首先,在字符串 ...

  4. POJ 1084

    WA了好久,第一次用重覆盖的模型做题.感觉这题有个陷阱,那就是当去掉某些边后,若因为这个边去掉而被破环的正方形还存在,那么就会造成覆盖不完全,WA. 所以,在去掉边后,必定有些正方形是不存在的,须重新 ...

  5. 错误总结之播放器(vitamio)音量实体键与触摸手势控制,音量调节冲突

    这个但是独家心得:经过几天的网上资料查询未果,在群里遇到一同行. 然后让他帮我看了看,终于攻克了该冲突. 此时,谨以此来感谢那位同僚的热情帮助: 说说这个问题吧: 眼下我在做一款影视方面的项目,在该项 ...

  6. 基于I/O的Server/Client实现

    在前面的文章中讲了基于NIO实现的Server/Client.本文就讲讲基于同步堵塞式I/O实现的Server/Client好与前面的NIO中的Server/Client进行对照. 网络编程中须要解决 ...

  7. Oracle动态显示日志

    1.查看日志文件位置. IND_USER@PROD>select inst_id,name,value from v$diag_info; INST_ID NAME                ...

  8. QQ好友列表数据模型封装

    QQ好友中的信息较多.假设我们单独从plist 中直接取出数据 是能够解决这个问题 可是相当复杂.以为列表中分组 .每组中还有不同信息 大致模型是 数组套数组  数组套字典 所以我们要封装数据模型 / ...

  9. 黑马程序猿——JAVA基础——集合

    ----------android培训.java培训.java学习型技术博客.期待与您交流.------------  一.关于java中的集合类        首先看一下,大致的框架流程图     ...

  10. Maximal Rectangle [leetcode] 的三种思路

    第一种方法是利用DP.时间复杂度是 O(m * m * n) dp(i,j):矩阵中同一行以(i,j)结尾的所有为1的最长子串长度 代码例如以下: int maximalRectangle(vecto ...