Tìm tổng của tất cả các bội số của 3 hoặc 5 dưới 1000 Java

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 : 110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
2
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
5
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
8

Input : N = 20
Output : 110
9

110
0
110
1

110
0
110
3

 

110
0
110
5
110
6

110
7

 

110
8

// multiples of 2 and 5 below N

Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0 // CPP program to find the sum of all2
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0 // CPP program to find the sum of all5

Input : N = 20
Output : 110
9

110
0// CPP program to find the sum of all8

110
0// multiples of 2 and 5 below N0

110
0// multiples of 2 and 5 below N2

 

110
0
110
5 // multiples of 2 and 5 below N5

110
7

 

// multiples of 2 and 5 below N7

// multiples of 2 and 5 below N8 // multiples of 2 and 5 below N9

Input : N = 20
Output : 110
9

110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0 #include 4

 

110
0#include 6

 

110
0
110
5 #include 9

110
7

C




using1

// multiples of 2 and 5 below N

using3

 

// Function to find sum of AP series

Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
2
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
5
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
8

Input : N = 20
Output : 110
9

110
0
110
1

110
0
110
3

 

110
0
110
5
110
6

110
7

 

110
8

// multiples of 2 and 5 below N

Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0 // CPP program to find the sum of all2
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0 // CPP program to find the sum of all5

Input : N = 20
Output : 110
9

110
0// CPP program to find the sum of all8

110
0// multiples of 2 and 5 below N0

110
0// multiples of 2 and 5 below N2

 

110
0
110
5 // multiples of 2 and 5 below N5

110
7

 

// multiples of 2 and 5 below N7

// multiples of 2 and 5 below N8 // multiples of 2 and 5 below N9

Input : N = 20
Output : 110
9

110
0
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
0 #include 4

 

110
0
Input : N = 20
Output : 110
11
Input : N = 20
Output : 110
12
Input : N = 20
Output : 110
13
Input : N = 20
Output : 110
14

 

110
0
110
5 #include 9

110
7

 

Input : N = 20
Output : 110
19

Java




Input : N = 20
Output : 110
20

// multiples of 2 and 5 below N

 

Input : N = 20
Output : 110
22
Input : N = 20
Output : 110
23

// Function to find sum of AP series

Input : N = 20
Output : 110
25
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
2
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
5
Input : N = 20
Output : 110
0
Input : N = 20
Output : 110
8

Input : N = 20
Output : 110
9

110
0
110
1

110
0
110
3

 

110
0
110
5
Input : N = 20
Output : 110
12_______117_______8
110
30
Input : N = 20
Output : 110
42
110
32
110
05
Input : N = 20
Output : 110
61
Input : N = 20
Output : 110
64
110
32
110
22

Tổng các bội số của 3 và 5 dưới 1000 là bao nhiêu?

ở đây a là 3 hoặc 5 hoặc 15 và n là 999 hoặc 1000 nhưng 999 là tốt nhất, sau đó tính tổng các bội số của 3. 3[[333]∗[333+1]/2]=166833 cộng bội số của 5. 5[[199]∗[199+1]/2]=99500; . 233168.

Tổng của tất cả các bội số của 5 dưới 1000 là bao nhiêu?

Đã trả lời gốc. Tổng của tất cả các bội số của 3 hoặc 5 dưới 1000 là bao nhiêu? . { 3. 166833, 5. 100500 }

Tổng các bội số dương của 3 nhỏ hơn 1000 là bao nhiêu?

Đáp án là 166.833 .

Tổng các bội số của 3 trong khoảng từ 300 đến 600 là bao nhiêu?

Trong trường hợp này, 99[303 + 597]/2 = 44550 . Nếu bạn không bao gồm 300 và 600 thì câu trả lời sẽ là 300 + 600 + 44550 = 45450.

Chủ Đề