File tree 6 files changed +160
-9
lines changed
solution/0800-0899/0829.Consecutive Numbers Sum
6 files changed +160
-9
lines changed Original file line number Diff line number Diff line change 43
43
44
44
<!-- 这里可写通用的实现逻辑 -->
45
45
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
+
46
58
<!-- tabs:start -->
47
59
48
60
### ** Python3**
49
61
50
62
<!-- 这里可写当前语言的特殊实现逻辑 -->
51
63
52
64
``` 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
54
74
```
55
75
56
76
### ** Java**
57
77
58
78
<!-- 这里可写当前语言的特殊实现逻辑 -->
59
79
60
80
``` 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
+ ```
61
114
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
+ }
62
128
```
63
129
64
130
### ** ...**
Original file line number Diff line number Diff line change 45
45
### ** Python3**
46
46
47
47
``` 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
49
57
```
50
58
51
59
### ** Java**
52
60
53
61
``` 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
+ ```
54
93
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
+ }
55
107
```
56
108
57
109
### ** ...**
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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 number Diff line number Diff line change 1
1
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 ;
7
8
}
8
9
}
9
- return res ;
10
+ return ans ;
10
11
}
11
- }
12
+ }
Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments