题目描述:
829. 连续整数求和 - 力扣(LeetCode) (leetcode-cn.com)
Java代码一:
class Solution {
public int consecutiveNumbersSum(int N) { //1 <= N <= 10 ^ 9,连续个数>=1;试求有多少组连续正整数满足所有数字之和为 N
int answer=0;
for(int amount=1,N2=N*2;(amount+1)*amount<=N2;amount++){
if(N2%amount==0&&amount%2+N2/amount%2==1)answer++;
}
return answer;
}
}
Java代码二:
class Solution {
public int consecutiveNumbersSum(int N) { //1 <= N <= 10 ^ 9,连续个数>=1;试求有多少组连续正整数满足所有数字之和为 N
int answer=0;
for(int amount=1;N>0;N-=amount++)
if(N%amount==0)
answer++;
return answer;
}
}
解释:
1、以N=9为例
1)连续个数amount=1,9能平均分给这1个数,answer++;接下来要考察连续个数为2的情况,即a、a+1这样的情况,怎么才能保证平均数为a?把和减1即可,于是N=9-1=8,只需考察是否存在a、a(第2个数不是a+1了哦)的情况
2)连续个数amount=2,8能平均分给a、a这两个数,于是answer++;接下来要考察连续个数为3的情况,即a-1,a,a的情况(注意:后2个数的差距已经消除了),要消除这3个数的差距,只需让后2个数同时减1即可。于是和变成N=8-2=6,3个数变成a-1,a-1,a-1,只需考察6是否能平均分给这3个数即可
3)连续个数amount=3,6能平均分成3份,于是answer++;接下来要考察连续个数为4的情况,即a-2,a-1,a-1,a-1(注意:后3个数的差距已经消除了),要消除这4个数的差距,只需让后3个数同时减1即可。于是和变成N=6-3=3,4个数变成a-2,a-2,a-2,a-2,只需考察3能否平均分给这4个数即可。
其实到这就可以结束了(无需到N<=0)。因为此时N<amount,要满足每份为整数,则只有N=0,此时每个数分到0(即最小的数为0),又因为最小数>=1,所以不行。
于是代码可以改进,如下:
class Solution {
public int consecutiveNumbersSum(int N) { //1 <= N <= 10 ^ 9,连续个数>=1;试求有多少组连续正整数满足所有数字之和为 N
int answer=0;
for(int amount=1;N>=amount;N-=amount++) //把N>0改成了N>=amount
if(N%amount==0)
answer++;
return answer;
}
}