news 2026/5/27 16:41:30

算法题 连续整数求和

作者头像

张小明

前端开发工程师

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/5/21 16:12:06

龙芯双周会--硬核的技术讨论会

龙芯爱好者社区创立于 2024 年 10 月 24 日程序员节&#xff0c;是一个由第三方爱好者、行业人员与学生组成的&#xff0c;致力于龙芯&#xff08;龙架构&#xff09;软硬件生态建设的互联网社区。 “龙芯双周会”是“龙芯爱好者社区”每两周举办的一次技术交流。在这里没有领…

作者头像 李华
网站建设 2026/4/28 17:24:28

从零到上线:Open-AutoGLM在Windows 10/11的完整部署路径(附脚本工具包)

第一章&#xff1a;Open-AutoGLM部署概述Open-AutoGLM 是一个开源的自动化通用语言模型推理与部署框架&#xff0c;旨在简化大语言模型在生产环境中的集成流程。该框架支持多种后端引擎、动态批处理、模型量化以及 REST/gRPC 接口暴露&#xff0c;适用于高并发、低延迟的 AI 服…

作者头像 李华
网站建设 2026/5/12 6:51:55

如何评估一个公司的测试文化和技术水平?

测试作为核心竞争力的时代‌ 在2025年的今天&#xff0c;软件质量已直接关乎企业的生存与发展。敏捷、DevOps、持续交付等范式普及&#xff0c;使得测试不再仅是开发流程的末端环节&#xff0c;而是贯穿价值交付全程的核心保障与反馈机制。因此&#xff0c;评估一个公司的测试…

作者头像 李华
网站建设 2026/5/8 20:14:06

‌从测试到韧性:软件测试从业者的灾难恢复演练实战指南

测试在灾难恢复中的核心价值‌ 在软件系统的生命周期中&#xff0c;灾难恢复&#xff08;Disaster Recovery, DR&#xff09;不仅是运维团队的职责&#xff0c;更是测试从业者保障业务连续性的关键战场。DR流程测试演练通过模拟真实灾难场景&#xff08;如数据中心故障、网络中…

作者头像 李华
网站建设 2026/5/21 4:34:12

基于Springboot和vue的餐饮管理系统的设计与实现

系统简介 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&…

作者头像 李华