news 2026/1/16 8:26:13

算法题 连续整数求和

作者头像

张小明

前端开发工程师

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/23 16:51:28

【AndrejKarpathy】2025年AI大模型深度复盘:年度最深刻的行业分析!

AndrejKarpathy前几天发了一篇2025年LLM年度回顾。他是OpenAI联合创始人、前特斯拉AI总监&#xff0c;也是全球最有影响力的AI研究者之一。这篇文章里有6个观点&#xff0c;每一个都理解得非常深刻。强烈推荐大家看看。 第一: 训练方法彻底变了 2025年之前&#xff0c;训练一个…

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

MCP在7大AI框架中的实践应用,使用Python和TypeScript框架为LLM赋能!

MCP支持的AI框架 MCP支持的AI框架 AI代理工具包为开发者开放了各种API&#xff0c;让AI解决方案具备执行任务的工具&#xff0c;确保能给出准确结果&#xff0c;提升用户满意度。然而&#xff0c;把这些工具集成到AI应用里并进行管理&#xff0c;过程往往很繁琐。本文将为你介…

作者头像 李华
网站建设 2026/1/14 12:28:33

基于物联网的水环境智慧服务监测系统(有完整资料)

资料查找方式&#xff1a;特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可编号&#xff1a;T5702301M设计简介&#xff1a;本设计是基于STM32的水环境智慧服务监测系统&#xff0c;主要实现以下功能&#xff1a;1.可通过名类传感器实时采集环境中水…

作者头像 李华
网站建设 2025/12/25 22:44:20

安达发|单件生产≠低效!APS排程软件是模具厂的“效率魔术师”

在珠三角一家中型模具企业的生产车间&#xff0c;陈经理正面临着一个经典困境&#xff1a;汽车客户催得最急的保险杠模具已经延期两周&#xff0c;而数控加工中心却在为另一套不那么紧急的手机壳模具忙碌。更棘手的是&#xff0c;一位核心编程工程师突然病假&#xff0c;他负责…

作者头像 李华
网站建设 2026/1/13 13:28:05

【源码分析 01】项目综述:InfiniteTalk 的设计哲学与核心架构

引言在数字人&#xff08;Digital Human&#xff09;和 AI 驱动的嘴型同步&#xff08;Talking Head Generation&#xff09;领域&#xff0c;虽然已有如 SadTalker、Wav2Lip、LivePortrait 等优秀项目&#xff0c;但在面对“超长时长”和“极致稳定性”的需求时&#xff0c;开…

作者头像 李华