Vấn đề hiện tại là tìm tổng của tất cả các số nhỏ hơn một số N đã cho chia hết cho 3 và/hoặc 5. Chúng tôi sẽ khám phá vấn đề này và hiển thị nhiều giải pháp với giải pháp O[1] thời gian không đổi
Trong bài toán này, bạn sẽ có ý tưởng về cách lấy tổng của các số nguyên liên tiếp trong thời gian không đổi mà không thực sự cộng chúng lại. Với ý tưởng của bài toán, bạn cũng có thể giải Bài toán 1 của Dự án Euler
Thí dụ
Nếu chúng ta xem xét N = 20, thì các số chia hết cho 3 và/hoặc 5 là
3, 5, 6, 9, 10, 12, 15, 18, 20
Tổng các số là 98. Do đó, 98 là câu trả lời của chúng tôi cho N = 20
Ý tưởng cơ bản để giải quyết vấn đề này một cách hiệu quả là
Tổng các số nguyên từ 1 đến N = N * [N-1]/2
Giải pháp đơn giản O[N]
Giải pháp đơn giản là duyệt qua tất cả các phần tử từ 1 đến N và kiểm tra từng phần tử nếu nó chia hết cho 3 hoặc 5. Nếu nó chia hết, chúng ta sẽ thêm nó vào một biến chung
mã giả
sum = 0;
for i from 1 to N
if i % 3 == 0 OR i % 5 == 0
sum += i;
Nếu chúng ta giả sử rằng hoạt động của mô-đun mất thời gian không đổi, thì độ phức tạp tổng thể của thuật toán là O[N]
Trong thực tế, các hoạt động như phép nhân và mô-đun mất thời gian O[log N] và do đó, độ phức tạp về thời gian của phương pháp này sẽ là O[N log N]
Thực hiện
class opengenus
{
static int find_sum[int N]
{
int sum = 0;
for[int i = 1; i < N; i++]
if[i%3 == 0 || i%5 == 0]
sum += i;
return sum;
}
public static void main [String[] args]
{
int N = 10000;
int sum = find_sum[N];
System.out.println[sum];
}
}
đầu ra
23331668
Cách tiếp cận này hoạt động nhanh đối với các số nhỏ hơn và thậm chí, chúng tôi chuyển sang các số cao hơn như 10^9, điều này trở nên chậm. Để giải quyết vấn đề này, chúng tôi sẽ xây dựng thuật toán thời gian không đổi
cách tiếp cận hiệu quả
Chúng tôi sẽ giải quyết vấn đề này trong thời gian liên tục
Hãy để chúng tôi giải phiên bản giới hạn của vấn đề trong đó chúng tôi cần tìm tổng các số chia hết cho 3. Đối với điều này, chúng ta có thể sử dụng phương pháp kiểm tra từng số trước đó để tận dụng một thuộc tính toán học cơ bản
tài sản là
Tổng các số từ 1 đến N là N*[N-1]/2
Điều này có nghĩa là tổng các số từ 1 đến 1000 chỉ đơn giản là 1000 * 999/2 = 499500
Bạn cần hiểu điều này sẽ giúp chúng tôi như thế nào
Xét 5 bội số đầu tiên của 3 là
3, 6, 9, 12, 15 bằng 3 nhân với 5 số nguyên đầu tiên [1, 2, 3, 4, 5]
Tổng của 5 bội số đầu tiên của 3=
= 3 + 6 + 9 + 12 + 15
= 3 * [1 + 2 + 3 + 4 + 5]
= 3 * [tổng của 5 số nguyên đầu tiên]
Chúng ta biết tổng của 5 số nguyên đầu tiên là 5 * 4/2 = 10. Vì vậy, tổng của 5 bội số đầu tiên của 3 là 3 * 10 là 30
Để tìm tổng các số < N là bội của 3, ta cần tìm giới hạn trên của bội của 3. Hãy để chúng tôi biểu thị giới hạn trên là M
Nó là như vậy mà
M * 3 N
Điều này có thể dễ dàng tìm ra bằng cách chia N cho 3 và lấy số sàn. Cách tiếp cận khác là tìm mô đun của N bằng 3 và trừ nó khỏi N mà sau đó chúng ta có thể chia cho 3
Giới hạn trên bội số của 3 chuỗi = M
M = floor [N / 3]
or
M = [N - N%3] / 3
Do đó, với N bất kỳ, để tìm tổng các số chia hết cho 3 và nhỏ hơn N
- Ta cần tìm M
- Tổng = 3 * M * [M-1] / 2
Tương tự, cho 5
M = floor [N / 5]
or
M = [N - N % 5] / 5
Sum = 5 * M * [M-1] / 2
Chúng ta có thể tìm tổng các bội số của 3 và 5 một cách riêng biệt. Tại thời điểm này, nếu chúng ta cộng cả hai, chúng ta sẽ nhận được một số có bội số của 15 [3 * 5] được thêm hai lần. Để có câu trả lời cuối cùng, chúng ta cần trừ bội số của 15 từ tổng
Điều này đơn giản vì chúng ta có thể sử dụng những hiểu biết của mình để tính tổng các bội số của 15
Do đó, giải pháp cuối cùng là
Sum of numbers less than N which are multiples of 3
= Sum of multiples of 3 + Sum of multiples of 5 - Sum of multiples of 15
Tìm tổng các bội số của 3 hoặc bất kỳ số nào đã cho mất thời gian không đổi O[1] nếu bạn xem xét các phép toán cơ bản như phép nhân mất thời gian O[1]
Cho một số N. và nhiệm vụ là tìm tổng của tất cả các bội số của 2 và 5 bên dưới N [ N có thể lên tới 10^10].
ví dụ.
Input : N = 10 Output : 25 Explanation : 2 + 4 + 6 + 8 + 5
Input : N = 20 Output : 110
Khuyến khích. Vui lòng thử cách tiếp cận của bạn trên {IDE} trước, trước khi chuyển sang giải pháp
Tiếp cận.
Chúng tôi biết rằng bội số của 2 tạo thành một AP là.
2, 4, 6, 8, 10, 12, 14…. [1]
Tương tự, bội số của 5 tạo thành một AP như.
5, 10, 15……[2]
Bây giờ, Tổng[1] + Tổng[2] = 2, 4, 5, 6, 8, 10, 10, 12, 14, 15…
Ở đây, 10 được lặp lại. Trên thực tế, tất cả các bội số của 10 hoặc 2*5 đều được lặp lại vì nó được tính hai lần, một lần trong chuỗi 2 và một lần nữa trong chuỗi 5. Do đó, chúng ta sẽ trừ tổng của chuỗi 10 từ Tổng[1] + Tổng[2]
Công thức tính tổng A. p là.
n * [ a + l ] / 2
Trong đólà số lượng cụm từ,là cụm từ bắt đầu vàlà cụm từ cuối cùng.
Vì vậy, câu trả lời cuối cùng là.
S2 + S5 – S10
Dưới đây là việc thực hiện các phương pháp trên.
C++
// CPP program to find the sum of all
// multiples of 2 and 5 below N
#include
using
namespace
std;
// Function to find sum of AP series
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1102
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1105
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1108
Input : N = 20 Output : 1109
1100
1101
1100
1103
1100
1105
1106
1107
1108
// multiples of 2 and 5 below N
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
// CPP program to find the sum of all
2Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
// CPP program to find the sum of all
5Input : N = 20 Output : 1109
1100
// CPP program to find the sum of all
81100
// multiples of 2 and 5 below N
01100
// multiples of 2 and 5 below N
2
1100
1105
// multiples of 2 and 5 below N
51107
// multiples of 2 and 5 below N
7
// multiples of 2 and 5 below N
8 // multiples of 2 and 5 below N
9
Input : N = 20 Output : 1109
1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
#include
4
1100
#include
6
1100
1105
#include
91107
C
using
1
// multiples of 2 and 5 below N
using
3
// Function to find sum of AP series
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1102
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1105
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1108
Input : N = 20 Output : 1109
1100
1101
1100
1103
1100
1105
1106
1107
1108
// multiples of 2 and 5 below N
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
// CPP program to find the sum of all
2Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
// CPP program to find the sum of all
5Input : N = 20 Output : 1109
1100
// CPP program to find the sum of all
81100
// multiples of 2 and 5 below N
01100
// multiples of 2 and 5 below N
2
1100
1105
// multiples of 2 and 5 below N
51107
// multiples of 2 and 5 below N
7
// multiples of 2 and 5 below N
8 // multiples of 2 and 5 below N
9
Input : N = 20 Output : 1109
1100
Input : N = 20 Output : 1100
Input : N = 20 Output : 1100
#include
4
1100
Input : N = 20 Output : 11011
Input : N = 20 Output : 11012
Input : N = 20 Output : 11013
Input : N = 20 Output : 11014
1100
1105
#include
91107
Input : N = 20 Output : 11019
Java
Input : N = 20 Output : 11020
// multiples of 2 and 5 below N
Input : N = 20 Output : 11022
Input : N = 20 Output : 11023
// Function to find sum of AP series
Input : N = 20 Output : 11025
Input : N = 20 Output : 1100
Input : N = 20 Output : 1102
Input : N = 20 Output : 1100
Input : N = 20 Output : 1105
Input : N = 20 Output : 1100
Input : N = 20 Output : 1108
Input : N = 20 Output : 1109
1100
1101
1100
1103
1100
1105
Input : N = 20 Output : 11012_______117_______8
11030
Input : N = 20 Output : 11042
11032
11005
Input : N = 20 Output : 11061
Input : N = 20 Output : 11064
11032
11022