`
eriol
  • 浏览: 407992 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

求和为n的连续正整数序列

阅读更多

题目:输入一个正数n,输出所有和为n连续正整数序列。

 

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。

 

 

解法1

 

因为整数序列是有序的,可以设立两个游标begin和end,通过判区间[begin,end]的和是否为N来得到这个序列。如果区间和大于n,begin往前移动,如果小于n,end往前移动,等于就输出这个区间。时间复杂度是0(n)。

 

public void find(int n) {
    if (n > 0 && ((n & n-1) == 0)) {
        System.out.println("no way");
	return;
    }
		
    int begin = 1; 
    int end = 2;
    int sum = begin + end;
		
    while (begin < end && begin < (n+1)/2) {
        if (sum < n) {
	    end++;
	    sum += end;
	} else if (sum > n) {
	    sum -= begin;
	    begin++;
	} else {
	    System.out.println(n + " can be divided from " + begin + " to " + end);
	    sum -= begin;
	    begin++;
	}
    }
}

 

 

解法2

 

假设自然数n可以拆分成:m, m+1, …, m+k-1 (m >= 1, k >= 2),则 n = (m + m+k-1)*k/2 即 2*n = (2*m+k-1)*k。

由于(2*m+k-1)与k的奇偶性是相反的,因此,可以先将n的所有质因子2提取出来,得到:2 * n = 2^t * a * b,由于(2*m+k-1)与k的奇偶性相反,且(2*m+k-1) > k,当确定了a,b时,可得到2*n的两组拆分(2^t * a, b) 和 (a, 2^t * b)(当a等于b时,这两组拆分是一样的),对每组拆分,k是较小的数。

 

public void find2(int n) {
    if (n <= 0)
        return;
		
    int count = 1;
    int i;
    int j;
    while(n % 2 == 0) {
        n /= 2;
	count++;
    }
		
    for (i = 1; ; i += 2) {
        if (n % i != 0)
            continue;
        j = n / i;
        if (i > j)
            break;
			
        if ((i << count) < j)
            print(j, i << count);
        else 
            print(i << count, j);
			
        if (i == j) break;
        if (i == 1) continue;
			
        if ((j << count) < i)
            print(i, j << count);
        else
            print(j << count, i);
    }
}
	
private void print(int i, int j) {
    int k = j;
    int m = (i-j+1) / 2;
    System.out.println("from " + m + " to " + (m+k-1));
}
 
分享到:
评论

相关推荐

    求出所有和为1000的连续正整数

    这个问题要求我们找出所有连续正整数序列,其和等于1000。这是一个典型的数学与编程结合的问题,我们可以利用JavaScript来实现。下面将详细阐述解决此问题的方法。 首先,我们需要明确一点:连续的正整数序列可以...

    javascript求出所有和为1000的连续正整数

    首先,我们要理解什么是连续正整数,连续正整数指的是一个正整数序列,其中每个数字比前一个大1。例如,1, 2, 3就是一组连续正整数,它们的和是6。 解决这个问题,我们可以从最小的连续正整数对开始,即1和2,然后...

    1到n的阶乘求和

    阶乘是一个数与小于等于它的所有正整数的乘积,表示为n!。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。 为了计算从1到n的阶乘求和,我们可以采用以下步骤: 1. **初始化变量**:首先,我们需要一个变量来存储当前的...

    有1个包含N个整数的数组A,定义1个数组的美丽值为数组中所有不同整数的和。求数组A的所有连续子序列的美丽值之和。

    有1个包含N个整数的数组A,定义1个数组的美丽值为数组中所有不同整数的和。求数组A的所有连续子序列的美丽值之和。

    分数序列求和

    此外,虽然这段代码可以正确计算序列的和,但没有考虑到错误处理和输入验证,例如,如果用户要求计算的项数不是正整数,程序可能会出现问题。 斐波那契序列在计算机科学中有很多应用,例如在算法设计、数据结构(如...

    输入两个正整数m和n求其最大公约数和最小公倍数 (2).pdf

    7. **阶乘序列求和**:递归或循环计算阶乘,然后累加。 8-18. **打印图案**:涉及控制台输出和字符串操作,通常使用嵌套循环实现。 19-24. **矩阵操作**:涉及二维数组的处理,包括遍历、求和、平均值、最大值等。...

    vb 随机函数产生2个两位正整数,求这2个数之和并显示出来

    下面是一段示例代码,展示了如何生成两个两位正整数并求和: ```vb Private Sub Command1_Click() ' 初始化随机数生成器 Randomize ' 生成第一个两位正整数 Dim num1 As Integer num1 = Int((99 - 10 + 1) * ...

    基于C++,写一个计算求和的函数模板,用户从键盘输入若干整数,以-1为结束标志,实现对用户输入的值进行求和,并返回求和结果

    本练习旨在帮助新手掌握C++中的函数模板和基本输入输出操作,以实现一个计算用户输入整数序列和的功能。 首先,我们需要理解函数模板的基本概念。函数模板是一个未指定类型参数的函数定义,它在编译时会根据传入的...

    n阶求和 (源码)

    阶乘是指所有小于及等于一个正整数的正整数的乘积,通常用符号“!”表示。例如,5的阶乘写作5! = 5 × 4 × 3 × 2 × 1 = 120。阶乘在概率论、组合数学以及许多其他数学领域都有广泛的应用。 ##### 2. 算法优化 ...

    计算前N项之和(c语言)

    这里 `1.0` 是为了确保除法运算为浮点数,因为C语言中的 `/` 运算符在两个整数之间默认为整数除法。`2*i-1` 代表序列中的当前项,随着循环的进行,`i` 依次取1、2、3...直到N,计算出每一项的值并累加到 `s` 中。 ...

    微软面试题 连续相加等于500

    题目中的代码实现了一个算法来寻找所有可能的连续整数序列,使得这些整数的和为500。该算法主要通过循环遍历不同的起始点和长度,计算满足条件的序列,并打印输出结果。 #### 2. 关键变量解释 - `int m;`:代表序列...

    用 VB 做的一个 《阶乘求和》

    阶乘是一个数学运算,表示一个正整数n的所有小于等于n的正整数的乘积,表示为n!。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。阶乘在组合数学、概率论以及计算某些序列中起着关键作用。 接下来,我们讨论如何在VB中...

    输入数阶乘求和

    (n的阶乘),即所有小于及等于n的正整数的乘积。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。特别地,0! 和 1! 的值都定义为1。 ##### 2. 阶乘递归算法 程序中使用了递归方法来计算阶乘,这是一种常见的计算阶乘的...

    Python实现分数序列求和

    分数序列通常是指一系列分数,其中每个分数都是由两个正整数分子和分母组成的。在这个特定的问题中,我们面临的是一个特定的分数序列,它遵循斐波那契数列的规则。斐波那契数列是一个数列,其中每个数字是前两个数字...

    计算 S=1!+2!+3!+...+N! C语言代码

    阶乘是一个正整数n的乘积,所有小于等于n且大于0的正整数。例如,5!(5的阶乘)等于5×4×3×2×1,结果为120。 接下来,我们将探讨如何用C语言实现这个计算过程。C语言是一种面向过程的编程语言,非常适合进行这种...

    蓝桥杯官网系统试题集部分

    在Java中,我们可以通过读取整数n,然后利用公式计算1到n的和。这里用到了`Scanner`类来获取用户输入,以及`nextInt()`方法读取整数,最后使用`printf`格式化输出结果。 2. **圆的面积问题**: - 这个问题要求计算...

    级数求和方法大全

    2. **级数的收敛性**:如果存在一个实数 \(S\) 使得对任何正整数 \(N\),级数的部分和 \(S_N = \sum_{n=1}^{N} a_n\) 的极限 \(\lim_{N \to \infty} S_N = S\) 存在,则称该级数收敛于 \(S\)。 3. **级数的类型**:...

    求阶乘和_阶乘_求和_vb6_

    在这个特定的VB6程序中,我们不是简单地求和,而是计算阶乘的序列之和,即对于给定的正整数n,我们将1! + 2! + 3! + ... + n!累加起来。 现在,让我们来看看如何在VB6中实现这个功能。首先,你需要创建一个新的标准...

    第n个奇数及其求和pta题解.docx

    + 1/(2n-1)的和,其中n为输入的正整数。解决这个问题的关键在于理解等差数列的求和公式,并将其应用于奇数序列。我们可以使用循环结构,逐项累加,或者利用数学公式直接计算。 对于这类问题,Python的简洁语法可以...

    输入两个正整数m和n求其最大公约数和最小公倍数.pdf

    3. **位数检测**:计算正整数的位数可以直接通过将其转换为字符串并获取其长度来完成。 4. **数字倒序**:反转整数的每一位可以通过将数字转换为字符串,然后反向遍历字符串来实现。 5. **成绩统计**:在输入一...

Global site tag (gtag.js) - Google Analytics