Skip to content

Commit 37bf909

Browse files
committed
feat: add solutions to lc problem: No.0829
No.0829.Consecutive Numbers Sum
1 parent e454dbb commit 37bf909

File tree

6 files changed

+160
-9
lines changed

6 files changed

+160
-9
lines changed

solution/0800-0899/0829.Consecutive Numbers Sum/README.md

+67-1
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,88 @@
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46+
**方法一:数学推导**
47+
48+
连续正整数构成一个等差数列($d=1$)。我们假设等差数列的第一项为 $a$,项数为 $k$,则 $n=(a+a+k-1)*k/2$,即 $n*2=(a*2+k-1)*k$ ①。
49+
50+
由于是连续正整数, $a>=1$,所以 ① 可以化为 $n*2>=(k+1)*k$,即 $k*(k+1)<=n*2$ ②。
51+
52+
因此,$k$ 的范围需要满足 $k>=1$ 并且 $k*(k+1)<=n*2$。另外,我们从 ① 式可以发现,$k$ 必须能整除 $n*2$。
53+
54+
综上,我们枚举 $k$,累加满足条件的 $k$ 的个数即可。
55+
56+
时间复杂度 $O(\sqrt{n})$。
57+
4658
<!-- tabs:start -->
4759

4860
### **Python3**
4961

5062
<!-- 这里可写当前语言的特殊实现逻辑 -->
5163

5264
```python
53-
65+
class Solution:
66+
def consecutiveNumbersSum(self, n: int) -> int:
67+
n <<= 1
68+
ans, k = 0, 1
69+
while k * (k + 1) <= n:
70+
if n % k == 0 and (n // k + 1 - k) % 2 == 0:
71+
ans += 1
72+
k += 1
73+
return ans
5474
```
5575

5676
### **Java**
5777

5878
<!-- 这里可写当前语言的特殊实现逻辑 -->
5979

6080
```java
81+
class Solution {
82+
83+
public int consecutiveNumbersSum(int n) {
84+
n <<= 1;
85+
int ans = 0;
86+
for (int k = 1; k * (k + 1) <= n; ++k) {
87+
if (n % k == 0 && (n / k + 1 - k) % 2 == 0) {
88+
++ans;
89+
}
90+
}
91+
return ans;
92+
}
93+
}
94+
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
int consecutiveNumbersSum(int n) {
103+
n <<= 1;
104+
int ans = 0;
105+
for (int k = 1; k * (k + 1) <= n; ++k) {
106+
if (n % k == 0 && (n / k + 1 - k) % 2 == 0) {
107+
++ans;
108+
}
109+
}
110+
return ans;
111+
}
112+
};
113+
```
61114
115+
### **Go**
116+
117+
```go
118+
func consecutiveNumbersSum(n int) int {
119+
n <<= 1
120+
ans := 0
121+
for k := 1; k*(k+1) <= n; k++ {
122+
if n%k == 0 && (n/k+1-k)%2 == 0 {
123+
ans++
124+
}
125+
}
126+
return ans
127+
}
62128
```
63129

64130
### **...**

solution/0800-0899/0829.Consecutive Numbers Sum/README_EN.md

+53-1
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,65 @@
4545
### **Python3**
4646

4747
```python
48-
48+
class Solution:
49+
def consecutiveNumbersSum(self, n: int) -> int:
50+
n <<= 1
51+
ans, k = 0, 1
52+
while k * (k + 1) <= n:
53+
if n % k == 0 and (n // k + 1 - k) % 2 == 0:
54+
ans += 1
55+
k += 1
56+
return ans
4957
```
5058

5159
### **Java**
5260

5361
```java
62+
class Solution {
63+
public int consecutiveNumbersSum(int n) {
64+
n <<= 1;
65+
int ans = 0;
66+
for (int k = 1; k * (k + 1) <= n; ++k) {
67+
if (n % k == 0 && (n / k + 1 - k) % 2 == 0) {
68+
++ans;
69+
}
70+
}
71+
return ans;
72+
}
73+
}
74+
```
75+
76+
### **C++**
77+
78+
```cpp
79+
class Solution {
80+
public:
81+
int consecutiveNumbersSum(int n) {
82+
n <<= 1;
83+
int ans = 0;
84+
for (int k = 1; k * (k + 1) <= n; ++k) {
85+
if (n % k == 0 && (n / k + 1 - k) % 2 == 0) {
86+
++ans;
87+
}
88+
}
89+
return ans;
90+
}
91+
};
92+
```
5493
94+
### **Go**
95+
96+
```go
97+
func consecutiveNumbersSum(n int) int {
98+
n <<= 1
99+
ans := 0
100+
for k := 1; k*(k+1) <= n; k++ {
101+
if n%k == 0 && (n/k+1-k)%2 == 0 {
102+
ans++
103+
}
104+
}
105+
return ans
106+
}
55107
```
56108

57109
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int consecutiveNumbersSum(int n) {
4+
n <<= 1;
5+
int ans = 0;
6+
for (int k = 1; k * (k + 1) <= n; ++k) {
7+
if (n % k == 0 && (n / k + 1 - k) % 2 == 0) {
8+
++ans;
9+
}
10+
}
11+
return ans;
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
func consecutiveNumbersSum(n int) int {
2+
n <<= 1
3+
ans := 0
4+
for k := 1; k*(k+1) <= n; k++ {
5+
if n%k == 0 && (n/k+1-k)%2 == 0 {
6+
ans++
7+
}
8+
}
9+
return ans
10+
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
class Solution {
2-
public int consecutiveNumbersSum(int N) {
3-
int res = 0;
4-
for (int i = 1; i * (i - 1) / 2 < N; ++i) {
5-
if ((N - i * (i - 1) / 2) % i == 0) {
6-
++res;
2+
public int consecutiveNumbersSum(int n) {
3+
n <<= 1;
4+
int ans = 0;
5+
for (int k = 1; k * (k + 1) <= n; ++k) {
6+
if (n % k == 0 && (n / k + 1 - k) % 2 == 0) {
7+
++ans;
78
}
89
}
9-
return res;
10+
return ans;
1011
}
11-
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def consecutiveNumbersSum(self, n: int) -> int:
3+
n <<= 1
4+
ans, k = 0, 1
5+
while k * (k + 1) <= n:
6+
if n % k == 0 and (n // k + 1 - k) % 2 == 0:
7+
ans += 1
8+
k += 1
9+
return ans

0 commit comments

Comments
 (0)