news 2026/1/8 4:46:55

算法题 连续整数求和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 连续整数求和

829. 连续整数求和

问题描述

给定一个正整数n,返回可以表示为连续正整数之和的方案数。

示例

输入:n=5输出:2解释:5=2+3,共2种表示方法(包括5本身)
输入:n=9输出:3解释:9=9=4+5=2+3+4,共3种表示方法
输入:n=15输出:4解释:15=15=7+8=4+5+6=1+2+3+4+5,共4种表示方法

算法思路

数学推导

  1. 数学建模

    • 连续整数从a开始,共k个数:a + (a+1) + (a+2) + ... + (a+k-1) = n
    • 等差数列求和公式:k*a + k*(k-1)/2 = n
    • 整理:a = (n - k*(k-1)/2) / k
    • 要求a为正整数,即(n - k*(k-1)/2) > 0且能被k整除
  2. 关键

    • 从公式n = k*a + k*(k-1)/22n = k*(2a + k - 1)
    • m = 2a + k - 1,则2n = k*m
    • 由于a ≥ 1,所以m = 2a + k - 1 ≥ k + 1,即m > k
    • km的奇偶性不同(因为m - k = 2a - 1是奇数)
  3. 方法

    • 方法一:直接枚举长度k,验证是否存在合法的起始值a
    • 方法二:计算n的奇数因子个数

代码实现

方法一:枚举连续序列长度

classSolution{/** * 计算正整数n表示为连续正整数之和的方案数 * 通过枚举连续序列的长度k * * @param n 正整数 * @return 表示方案数 */publicintconsecutiveNumbersSum(intn){intcount=0;// k表示连续整数的个数,从1开始枚举// 条件:k*(k+1)/2 <= n,k的最大值约为sqrt(2n)for(intk=1;k*(k+1)/2<=n;k++){// n = k*a + k*(k-1)/2// a = (n - k*(k-1)/2) / kintnumerator=n-k*(k-1)/2;// 检查是否能整除且结果为正整数if(numerator>0&&numerator%k==0){count++;}}returncount;}}

方法二:奇数因子计数

classSolution{/** * 通过计算n的奇数因子个数来求解 * 数学结论:n表示为连续正整数之和的方案数等于n的奇数因子个数 * * @param n 正整数 * @return 表示方案数 */publicintconsecutiveNumbersSum(intn){// 移除所有的因子2,得到奇数部分while(n%2==0){n/=2;}intcount=1;// 至少有因子1// 枚举奇数因子,从3开始for(inti=3;i*i<=n;i+=2){intexponent=0;// 计算当前奇数因子的指数while(n%i==0){exponent++;n/=i;}// 因子个数公式:(e1+1)*(e2+1)*...count*=(exponent+1);}// 如果n > 1,说明还有一个大于sqrt(原n)的奇数质因子if(n>1){count*=2;}returncount;}}

算法分析

  • 时间复杂度:O(√n)
    • k的最大值满足k*(k+1)/2 ≤ nk ≈ √(2n)
  • 空间复杂度:O(1)
    • 只使用常数额外空间

算法过程

输入:n = 15

方法一:

  1. k = 1numerator = 15 - 0 = 1515 % 1 == 0a = 15[15]
  2. k = 2numerator = 15 - 1 = 1414 % 2 == 0a = 7[7,8]
  3. k = 3numerator = 15 - 3 = 1212 % 3 == 0a = 4[4,5,6]
  4. k = 4numerator = 15 - 6 = 99 % 4 != 0
  5. k = 5numerator = 15 - 10 = 55 % 5 == 0a = 1[1,2,3,4,5]
  6. k = 66*7/2 = 21 > 15,停止

结果:4种方案

方法二:

  1. 移除因子2:15是奇数,保持不变
  2. 质因数分解:15 = 3¹ × 5¹
  3. 奇数因子个数:(1+1) × (1+1) = 4
  4. 奇数因子:1, 3, 5, 15

结果:4个奇数因子 → 4种方案

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:n = 5System.out.println("Test 1 (n=5): "+solution.consecutiveNumbersSum(5));// 2// 测试用例2:n = 9System.out.println("Test 2 (n=9): "+solution.consecutiveNumbersSum(9));// 3// 测试用例3:n = 15System.out.println("Test 3 (n=15): "+solution.consecutiveNumbersSum(15));// 4// 测试用例4:n = 1(边界情况)System.out.println("Test 4 (n=1): "+solution.consecutiveNumbersSum(1));// 1// 测试用例5:n = 2(2的幂)System.out.println("Test 5 (n=2): "+solution.consecutiveNumbersSum(2));// 1// 测试用例6:n = 8(2的幂)System.out.println("Test 6 (n=8): "+solution.consecutiveNumbersSum(8));// 1// 测试用例7:n = 3System.out.println("Test 7 (n=3): "+solution.consecutiveNumbersSum(3));// 2// 测试用例8:n = 25System.out.println("Test 8 (n=25): "+solution.consecutiveNumbersSum(25));// 3// 25 = 25 = 12+13 = 3+4+5+6+7// 测试用例9:大数测试System.out.println("Test 9 (n=100): "+solution.consecutiveNumbersSum(100));// 3}

关键点

  1. 数学公式

    • 连续整数求和 → 等差数列求和公式
    • 转化为求解起始值a的存在性问题
  2. 奇数因子

    • 2的幂只能表示为自身(1种方案)
    • 奇数因子个数直接对应表示方案数
  3. 边界条件

    • n = 1:只有1种方案[1]
    • n是2的幂:只有1种方案(自身)

常见问题

  1. 为什么2的幂只有1种表示方法?
    2的幂没有奇数因子(除了1),而每个表示方案对应一个奇数因子。

  2. 奇数因子与表示方案的对应关系?
    每个奇数因子d对应一种以n/d为中心的对称表示(如果d是奇数长度)或相关的表示方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/2 12:39:52

如何用数据透视足球:建立你的理性扫盘分析体系

在足球的世界里&#xff0c;我们常常依赖一种模糊的“感觉”&#xff1a;因为喜欢某位球星而坚信他的球队会赢&#xff0c;因为一场大胜而认为该队状态“火热”&#xff0c;或是因为一个诡异的盘口变化而心神不宁。然而&#xff0c;正是这种依赖直觉与碎片信息的“感觉流”判断…

作者头像 李华
网站建设 2025/12/23 16:48:28

为什么顶级团队都在关注Open-AutoGLM?(开源地址+实战部署指南)

第一章&#xff1a;为什么顶级团队都在关注Open-AutoGLM&#xff1f;在人工智能快速演进的当下&#xff0c;自动化大模型应用已成为企业提升研发效率和业务响应能力的核心路径。Open-AutoGLM 作为开源领域首个聚焦于通用语言模型自动化调用与编排的框架&#xff0c;正迅速吸引全…

作者头像 李华
网站建设 2025/12/23 16:44:57

Open-AutoGLM手机部署避坑指南:7个核心技巧助你绕开常见失败陷阱

第一章&#xff1a;Open-AutoGLM手机部署避坑指南概述在将 Open-AutoGLM 模型部署至移动端设备时&#xff0c;开发者常因环境配置、算力限制或模型兼容性问题遭遇失败。本章旨在系统梳理部署过程中高频出现的技术陷阱&#xff0c;并提供可落地的解决方案&#xff0c;帮助开发者…

作者头像 李华
网站建设 2025/12/23 16:43:47

Open-AutoGLM本地部署避坑指南:99%新手都会犯的3个错误

第一章&#xff1a;Open-AutoGLM 怎么部署在自己电脑上部署 Open-AutoGLM 到本地计算机需要准备合适的运行环境&#xff0c;并按照标准流程安装依赖与模型组件。整个过程适用于具备基础命令行操作能力的用户&#xff0c;支持主流操作系统如 Linux、macOS 以及 Windows&#xff…

作者头像 李华
网站建设 2025/12/23 16:42:51

VR消防安全知识竞赛:“燃”动智慧,“竞”学消防

VR消防安全知识竞赛打破传统消防教育的刻板模式&#xff0c;以“沉浸式体验多人竞技”为核心亮点&#xff0c;搭配专属按钮答题台&#xff0c;支持2至5人同步抢答。产品构成1. 一体机&#xff1a;搭载高清VR显示模块与高性能处理器&#xff0c;为体验者呈现沉浸式消防场景&…

作者头像 李华