一个正整数如何分解为几个连续的正整数之和的形式

这篇博客介绍了如何通过等差数列公式解决一个问题:给定一个正整数,判断它是否能表示为几个连续正整数的和。文章提出,当数字不是2的幂时,可以通过公式S = (a1 + a1 + i - 1) * i /2来找到所有可能的连续整数和形式。作者提供了C++代码实现,其中包括IsTwo函数用于检查输入是否为2的幂,并展示了如何在O(n)时间内找到所有可能的分解方式。
摘要由CSDN通过智能技术生成
题目: 给定你一个数字 如:15    
15可分解为
7+8
4+5+6
1+2+3+4+5
再如:
8
8不可分解为任何连续的正整数之和
所以输出NONE
此题就是给定一个数字如果这个数字可以分解为几个连续的正整数之和那么就输出所有的形式,如果不能就输出NONE



题解:
其实这道题目可以用到数学中最基础的等差公式的方式:设给定的数字为S
S = a1 + a2 + a3 + a4....
S = a1 + a1 + 1 + a1 + 2 + a1 + 3....设一共有i个
S = (a1 + a1 + i - 1) * i /2

首先我们讨论那些数不能分解为上面的形式
a1 + a1 + i - 1   和 i  这两个数肯定要么一个为偶数要么一个为奇数(自己脑补),所以他们成绩除2得出的数肯定得有奇数因子,而2^n不可能有奇数因子,所以不能被整除。
那么如何判断一个数是否为2的n次方?
int IsTwo(int n)
{
    return (n&(n-1)) == 0 ? 1:0;
}
用此函数
n如果为2的n次方那么他的二进制表示肯定是第一位为1后面都是0
n-1恰好是最后一个是1其余多是0所以n&(n-1)肯定等于0

#include<iostream>
#include&
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值