news 2026/4/16 11:53:12

算法题 连续整数求和

作者头像

张小明

前端开发工程师

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/4/15 21:25:08

Docker在测试环境中的应用:效率、一致性与敏捷性的变革

在软件交付周期日益缩短、技术栈日趋复杂的今天&#xff0c;测试环境的稳定性、一致性与快速部署能力&#xff0c;已成为决定测试效能与发布质量的关键瓶颈。传统的物理机或虚拟机环境&#xff0c;常因配置差异、资源争用和启动缓慢等问题&#xff0c;导致“在我机器上是好的”…

作者头像 李华
网站建设 2026/4/16 11:02:36

Kubernetes上的测试:挑战与解决方案

测试范式的转变 Kubernetes已成为云原生应用事实上的部署与运行标准。其带来的自动扩缩容、滚动更新、声明式配置等特性&#xff0c;在提升运维效率和资源利用率的同时&#xff0c;也彻底改变了应用的运行态。对于测试团队而言&#xff0c;这意味着测试对象从一个相对静态的“…

作者头像 李华
网站建设 2026/4/16 11:02:33

如何在个人电脑部署Open-AutoGLM:从环境配置到成功运行全记录

第一章&#xff1a;Open-AutoGLM 本地部署概述Open-AutoGLM 是一个开源的自动化代码生成与推理框架&#xff0c;基于 GLM 架构实现本地化智能编程辅助。该系统支持代码补全、函数生成、错误修复等功能&#xff0c;适用于开发者在隔离环境中构建智能化开发流程。通过本地部署&am…

作者头像 李华
网站建设 2026/4/15 2:10:23

RRT*算法与三次 B 样条函数在机械臂轨迹避障中的应用

一种采用RRT*机械臂轨迹避障算法&#xff0c;然后采用三次B 样条函数对 所 规 划 路 径 进 行 拟 合 优 化。 带有较为详细的注视 rrt路径规划结合机械臂仿真 基于matlab&#xff0c;6自由度&#xff0c;机械臂rrt算法路径规划&#xff0c;输出如下效果&#xff0c;直接运行即可…

作者头像 李华
网站建设 2026/4/13 2:58:44

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

SCI的写作和发表是科研人提升自身实力和实现自己价值的必要途径。“如何利用有限的数据发表更多的SCI论文&#xff1f;”是我们需要解决的关键问题。一&#xff1a;ARCGIS软件的基本介绍和如何获取空间数据1. ArcGIS软件初识与如何获取空间数据&#xff1a;1.1 ArcCatalog、Arc…

作者头像 李华
网站建设 2026/4/12 4:39:37

uni-app 项目在 iOS 上架过程中常见的问题与应对方式

在 uni-app 项目里&#xff0c;开发阶段通常推进得很顺。页面逻辑、接口对接、跨端兼容&#xff0c;一旦跑通&#xff0c;团队很容易形成一种判断&#xff1a;“剩下的就是打包和上架了。” 但真正进入 App Store 上架流程后&#xff0c;很多问题才开始出现&#xff0c;而且这些…

作者头像 李华