`
zhou_zhihao
  • 浏览: 57179 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

问题23-所有不能被两个盈数相加的正整数之和

 
阅读更多

问题描述如下:

当一个数跟其真因子相加之和相等,那就称之为完美数(profect number)

如果一个数比其真因子相加之和还大,那就称之为亏数(deficient number),如果比真因子相加还小,那就称之为盈数(abundant number)。

12是最小的盈数,1+2+3+4+6=16>12.最小的两个盈数相加的正整数是14,我们可以知道大于28123的正整数都可以被两个盈数相加得到。

求不能被两个盈数相加的正整数之和?

 

代码实现如下:

 

	/**
	 * n的真因子之和
	 * 
	 * @param n
	 * @return
	 */
	private static int sumOfFactors(int n) {
		int result = 0;
		for (int i = 1; i < n; i++) {
			if (n % i == 0) {
				result += i;
			}
		}
		return result;
	}

	/**
	 * n是否是盈数
	 * 
	 * @param n
	 * @return
	 */
	private static boolean isAbundantNumber(int n) {
		return n < sumOfFactors(n);
	}

	/**
	 * 28123以下盈数数组
	 * 
	 * @return
	 */
	private static List<Integer> getAbundantNumbers() {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i < limit; i++) {
			if (isAbundantNumber(i)) {
				list.add(i);
			}
		}
		return list;
	}

	/**
	 * 不能被两个盈数相加的正整数之和
	 * @return
	 */
	private static int sum() {
		int sum = 0;
		List<Integer> list = getAbundantNumbers();
		for (int i = 1; i < limit; i++) {
			boolean flag = false;
			for (int number : list) {
				if (number > i / 2) {
					break;
				}
				int temp = i - number;
				if (list.contains(temp)) {
					flag = true;
					break;
				}
			}
			if (!flag) {
				sum += i;
			}
			System.out.println(i);
		}
		return sum;
	}

	private static final int limit = 28123;

可以得到答案:4179871

效率比较差,太困就不想优化了,有空再想,今天练一个就先睡了^_^

 

请不吝赐教。

@anthor ClumsyBirdZ

分享到:
评论

相关推荐

    用递归法计算从n个正整数中选择k个数的不同组合数

    在计算机科学和数学中,计算从n个正整数中选择k个数的不同组合数是一项基本的任务,这涉及到组合数学中的组合(Combination)概念。组合是指从一个集合中不考虑顺序取出k个元素的方法数,它与排列(Permutation)...

    一个数分成几个连续整数和

    标题中的“一个数分成几个连续整数和”指的是在数学领域中的一种问题类型,它涉及到将一个给定的正整数表示为若干个连续整数的和。这种问题在算法设计、数学竞赛以及数据分析中都有可能出现。连续整数和的问题通常...

    两个十以内的整数相加

    两个十以内的整数相加

    (数据结构与算法)两个大整数相加

    这篇博客文章“(数据结构与算法)两个大整数相加”提供了一个解决方案来应对这个问题。 首先,我们需要理解如何存储大整数。在大多数编程语言中,内置的整数类型如int或long通常有最大值限制,对于超出这些范围的...

    两个无限长的正整数相加减

    本程序实现了两个无限长的正整数相加减,使用数组实现。

    各位相加(递归求解+数学规律-树根)1

    问题描述是:给定一个非负整数 `num`,我们需要反复地将它的各个位上的数字相加,直至得到一个一位数。例如,对于输入值 38,经过计算 3 + 8 = 11,再计算 1 + 1 = 2,最后我们得到的结果是 2,因此返回 2。 解决...

    2个200位以内的数相加(C)

    我们经常遇到两多项式相加的情况,在这里,我们就需要用程序来模拟实现把 两个多项式相加到一起。首先,我们会有两个多项式,每个多项式是独立的一行,每个多项式由系数、幂数这样的多个整数对来表示。 如多项式2x20...

    python 和为s的连续正数序列,输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数

    # 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 # 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 # 输入示例 # 输入:target = 9 # 输出:[[2,3,4],[4,5]...

    python编写程序,生成10个随机整数,其中的奇数相加,偶数相加,结果进行输出两个和

    python编写程序,生成10个随机整数,其中的奇数相加,偶数相加,结果进行输出两个和。

    实现2个大数(80位左右)相加

    实现2个80位左右的大数相加,暂时不支持负数,只支持正整数。

    c语言 利用字符数组实现两个大整数的加减法.exe

    c语言 利用字符数组实现两个大整数的加减法.exe

    超长正整数相加(string逆序逐位相加再反转)1

    问题描述要求我们将两个表示大整数的字符串相加,并返回它们的和,也是以字符串形式表示。下面我们将详细探讨这个问题的解决方案及其涉及的知识点。 首先,我们要理解输入是两个字符串,它们分别存储了两个正整数。...

    最优分解问题

    最优分解问题是一个经典的数学优化问题,它涉及到如何有效地将一个正整数n分解为若干个互不相同的自然数之和,以使得这些自然数的乘积最大化。这个问题在计算机科学和算法设计中有着广泛的应用,特别是在寻找高效...

    数据结构试验报告

    实验一:线性表的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。 实验二:线性表的应用算法:构造两个按指数递增的有序链表,实现两个一元...

    C++堆栈实现超长整数加法

    当一个数的所有位都入栈后,另一个数的剩余位仍需与前一个数的进位相加。这个过程可以迭代直到没有更多的位或没有进位。最后,如果还有进位,需要将它作为结果的最前面一位。 以下是超长整数加法的基本步骤: 1. ...

    p100 - p119 为什么两个数相加和我们想到的结果不相同

    之所以使用补码,是因为如果不使用补码,直接通过符号位表示负数,会导致在进行加减运算时需要额外判断和转换,这会增加计算复杂度,影响性能。而补码使得正负数的加减法运算规则保持一致,简化了计算过程。 接下来...

    C语言做任意大的两整数相加减

    数组的每个元素代表大数的一部分,例如,一个数组可以表示一个正整数,数组中的元素从低位到高位依次存储每一位数字。 1. 大数的表示: 我们可以定义一个结构体来表示大数,结构体包含一个整型数组和数组长度两个...

    验证哥德巴赫猜想,任意一个大于等于6的偶数都可以分解为两个素数之和,VB6.0源代码编写

    ”简单来说,就是所有偶数(除了2本身)都能被看作两个质数相加的结果。例如,6=3+3,10=3+7,14=3+11等。 **质数的概念** 在数学中,质数是大于1且只有1和其本身两个正因子的自然数。换句话说,如果一个数只有两...

    C语言编一个程序完成64位数据(无符号)的加法,减法运算

    如果两个链表的长度不一致,则继续遍历较长的链表,并将剩余部分与进位相加。 ```c struct Long *add(struct Long *p, struct Long *q) { // ... (省略部分代码) } ``` #### 2.4 输出结果 `print()`函数用于打印...

    数的划分1

    标题中的"数的划分1"指的是数学中的一种问题,它涉及到将一个正整数分成若干个正整数的和。这种问题在计算机科学和算法设计中具有重要意义,因为它经常出现在组合优化、动态规划和递归算法等场景下。在描述中,我们...

Global site tag (gtag.js) - Google Analytics