题目描述
给定一个正整数 n
,返回 连续正整数满足所有数字之和为 n 的组数 。
示例 1:
输入: n = 5
输出: 2
解释: 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。
示例 2:
输入: n = 9
输出: 3
解释: 9 = 4 + 5 = 2 + 3 + 4
示例 3:
输入: n = 15
输出: 4
解释: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5
提示:
1 <= n <= 10^9
这道题分析下来就是分奇偶性讨论:一个数模偶数的结果必须是偶数的一半,比如18%4=2,也就是18/4=4.5,这样相当于平分,那么18可以表示成3,4,5,6四个数的和;一个数模奇数的结果必须是0,即必须能整除,比如15%5=3,那么15可以表示成1,2,3,4,5的五个数的和。为了加快效率,我们可以做一些判断,当模的结果大于模数的一半时,不可能找到一组连续的正整数使条件成立,比如15%6=3,照理应该是0,1,2,3,4,5六个数之和,但0不能包括在内,所以直接结束当前循环。
class Solution {
public int consecutiveNumbersSum(int n) {
int ans = 0;
int i = 1;
while(true){
if((double)n/i-(double)i/2<0)break;
if(i%2==1 && n%i==0)ans++;
if(i%2==0 && n%i==i/2)ans++;
i++;
}
return ans;
}
}
当然我这样做还是有些复杂,大佬们已经用数学搞出了简单效率又高的代码。
class Solution {
public int consecutiveNumbersSum(int n) {
int ans = 0; n *= 2;
for (int k = 1; k * k < n; k++) {
if (n % k != 0) continue;
if ((n / k - (k - 1)) % 2 == 0) ans++;
}
return ans;
}
}
今天总算自己做出一道困难(简单)题了,继续努力。