深入连续整数固定和
问题介绍及经典解法
对问题的思考
新的算法
问题介绍及经典解法
在冼镜光的《c语言名题精选百则》中,问题2.16为连续整数固定和问题。
问题描述:
编写一个程序,读入一个正整数,把所有连续的,和为给定的正整数的正整数找出来。解中不包含该给定的正整数本身。
书中给出的givenSum1的code如下:
private static void givenSum1(int given) {
int left, right;
int sum;
for (sum = 0, left = right = 1; left < given / 2 + 1; right++) {
sum += right;
while (sum > given) {
sum -= left;
left++;
}
if (sum == given) {
System.out.printf("\n%d - %d", left, right);
}
}
}
分析:
通过简单的分析可以看出,该算法的复杂度为O(N)。
对问题的思考
我们放宽一下问题的解,解中包含这个给定的正整数。
为了更好的研究该问题。我们引入以下定义。
定义:对于一个给定正整数N该问题的一个解可以表述为A=(a,length),其中a为该连续整数的最小整数,length为该连续整数的长度。
由于A为该问题的一个解,则可知:
f(A)=(a+(a+1)+(a+2)+...+(a+length-1))=N。
仔细考虑之后,我们可以得出以下两个结论。
1 若A和B是该问题的两个不同的解,则A和B中的连续整数的个数必不同。
证明:
设给定的正整数为N,设A和B是两个不同的解并且有相同的长度r,设A=(a,r),B=(b,r)。因为A和B都是解,所以有f(A)=f(B)。因为A和B是不同的解,有a!=b,有f(A)!=f(B)。
矛盾,命题成立。
2 若给定一个正整数N,设A=(a,r)是该问题的一个解,则(1+r)*r=<2*N。
证明:
因为A=(a,r)是一个解,N=f(A)>=f(1,r)=r*(1+r)/2,所以,
2*N>=(1+r)*r。
新的算法
根据对问题的思考,我们有了一个新的算法。
private static void givenSum2(int given) {
int i, sum, tem;
for (i = 1, sum = 0; given > sum; sum += i, i++) {
tem = given - sum;
if (tem % i == 0) {
System.out.printf("\n%d - %d", tem / i, tem / i + i - 1);
}
}
}
算法分析:
由结论2得知,该算法的复杂度为O(N^(1/2))。
分享到:
相关推荐
本节将深入探讨分枝定界法在MATLAB中的应用及其在解决整数和混合整数规划问题中的价值。 MATLAB作为一个强大的数值计算平台,提供了多种工具箱来处理优化问题,包括求解线性规划、整数规划和混合整数规划。然而,...
这个函数接受一个字符串`input`和一个整数`maxLength`作为参数,它会将`input`分割成多行,每行的长度不超过`maxLength`。注意,最后一行可能会短于`maxLength`,因为我们在每次达到或超过`maxLength`时都会插入换行...
总结来说,信息学竞赛中的整数和多项式理论涉及了基本的算术运算、多项式操作以及更深入的数学工具。理解并熟练运用这些知识对于参赛者来说是至关重要的,它们不仅可以帮助参赛者解决实际问题,还能培养其逻辑思维和...
本文将深入探讨C++中数组和指针的概念、特点以及它们之间的联系和区别。 #### 二、数组的概念及内存表示 数组是一种基本的数据结构,用于存储同类型元素的集合。每个元素都可以通过索引进行访问,索引通常是从0...
数组由一个固定的大小和连续的内存空间组成,可以通过索引来访问数组中的每一个元素。例如,我们可以声明一个整数数组`int arr[10]`,这会在内存中分配10个连续的整数存储位置。 指针是C/C++中的一个重要特性,它...
连续系统离散化方法是将连续时间域中的信号或系统转换为离散时间域中的表示,这一过程在数字信号...这些资料对于理解和应用连续系统离散化方法具有很高的价值,能够帮助读者深入理解数字信号处理和控制理论的核心原理。
《深入理解C语言指针成就高手之路》是一本旨在帮助读者精通C语言指针的教程。C语言中的指针是一个非常关键且强大的概念,它...通过深入学习和实践,你将能够更好地驾驭这一强大的工具,从而在C语言编程领域更进一步。
但对于大型游戏,数组的固定长度和复制开销可能不适用。 相比之下,切片是一种引用类型,它在内存中通过指向底层数组的指针进行操作,允许动态增长。切片可以通过`append()`函数添加元素,而不会改变其底层数组的...
离散控制器,特别是离散PID控制器,是数字控制系统中的核心组成部分。在现代自动化和工业领域,由于计算机技术的发展,模拟...通过深入理解这些概念和工具,工程师能够设计出满足各种控制需求的高性能离散PID控制器。
近年来,混合整数线性规划(MILP)结合了连续和离散变量,更加强大且应用广泛。 3. **非线性规划**:非线性规划处理的目标函数或约束条件包含非线性项,如二次项、指数、对数等。这使得问题的求解更为复杂,因为...
混合整数规划(Mixed Integer Programming, MIP)是一种优化技术,它结合了连续变量和离散变量,适用于处理有约束条件的决策问题。在电池容量优化中,MIP可以用来确定在满足特定目标(如最小化成本、最大化效率或...
通过阅读和分析这些代码,我们可以深入理解分支定界法的内部工作原理,包括如何构造搜索树、如何进行剪枝以减少搜索空间,以及如何有效地存储和更新解的信息。 在实际应用中,为了提高效率,可能还会涉及到其他优化...
综上所述,这个算法的核心在于创建一个基于固定密钥的加密过程,将连续的整数转化为唯一且位数固定的加密数字,适用于大数据量的唯一标识生成。它可能结合了对称加密算法、哈希函数等技术,并且可能有一个配套的代码...
19. 题目19可能是关于平方数和连续整数乘积的规律。 20. 题目20提到了理想分数,可能需要分析分数的性质和模式。 综上所述,这些题目覆盖了数学的多个领域,如数列、序列规律、运算规则、整数的性质、组合问题和...
在学习C语言的过程中,枚举(enum)是一种非常有用的特殊数据类型,它允许我们定义一组命名的常量,这些常量即代表了程序中的某些固定值。今天就让我们跟随涛哥一起,深入理解C语言中的枚举类型,并且探讨它在Linux...
整数的知识复习主要涵盖数的运算、统计图表的理解、方向与位置的认知以及几何图形的性质。以下是这些知识点的详细解析: 一、数的运算 ...通过深入学习和练习,学生可以增强计算能力,提升问题解决技巧。
计算机二级《C语言》辅导笔记深入讨论涵盖了C语言的基础概念和关键知识点,这些知识点对于理解和编写C语言程序至关重要。下面将详细阐述其中的三个重点考点。 **考点 1:编译预处理** 编译预处理是C语言编译过程中...
RAM用于临时存储运行时的数据和程序,而ROM则存储固定的系统程序或初始启动代码,即使电源断开也能保持其内容。 1. **RAM(随机存取存储器)**:RAM允许数据在任何位置被快速读取和写入,是计算机中的主存储器。在...
7. **分治和模拟**:解决复杂问题的策略,如大整数乘法(Karatsuba算法)和矩阵乘法。 通过深入学习这些数据结构和算法,开发者可以提高代码的效率和可维护性,为解决实际问题提供强大工具。无论你是Java初学者还是...