Bạn được cho một mảng số và k chưa sắp xếp, bạn cần tìm số nhỏ thứ k trong mảng. Ví
ví dụ nếu mảng đã cho là {1, 2, 3, 9, 4} và k=2 thì bạn cần tìm số nhỏ thứ 2 trong mảng,
which is 2.
Câu hỏi -. Số nguyên dương d được gọi là ước của số nguyên dương N khác nếu khi chia N cho d được số dư bằng 0. Ví dụ số 12 có 6 thừa số là 1, 2, 3, 4, 6, 12. Mọi số nguyên dương k đều có ít nhất hai ước là 1 và chính số k. Cho hai số nguyên dương N và k, viết chương trình in ra thừa số lớn thứ k của N
Định dạng đầu vào. Đầu vào là danh sách các cặp số nguyên dương được phân tách bằng dấu phẩy [N, k]
Định dạng đầu ra. Hệ số cao thứ k của N. Nếu N không có k thừa số thì đầu ra phải là 1
Hạn chế
Bạn có thể giả sử rằng N sẽ không có thừa số nguyên tố nào lớn hơn 13
ví dụ 1
Giải trình. N là 12, k là 3. Thừa số của 12 là [1,2,3,4,6,12]. Yếu tố cao nhất là 12 và yếu tố lớn thứ ba là 4. Đầu ra phải là 4
ví dụ 2
Giải trình. N là 30, k là 9. Thừa số của 30 là [1,2,3,5,6,10,15,30]. Chỉ có 8 yếu tố. Vì k nhiều hơn số thừa số nên đầu ra là 1
Tiếp cận. Ý tưởng là kiểm tra từng số trong phạm vi [N, 1] và in ra số thứ K chia hết cho N
Lặp qua vòng lặp từ N đến 0. Bây giờ, với mỗi số trong vòng lặp này
- Kiểm tra xem nó có chia hết N hay không
- Nếu N chia hết cho số hiện tại, hãy giảm giá trị của K đi 1
- Khi K trở thành 0, điều này có nghĩa là số hiện tại là thừa số lớn thứ K của N
- In đáp án theo quan sát trên
Dưới đây là việc thực hiện các phương pháp trên
C
488
489
490
491
492
493
492
495
492
41
42
43____04
43____06
43
48
49
492
4881
4882
4883
________ 1882 ________ 1885 ________ 1886
4887
4888
4887
4890
4882
4892
4882
4894
4882
4896
4882
4885
4899
________ 1887 ________ 1901 ________ 1902
4882
4904
43____1904
43____1908
43____1910
43____1901
4913
4904
4915
492
4917
42
43____192
4921
43______1923
49
4925
4926
43____1901
4929
4904
C++
4931
4932
4933
4934
4935
490
491
492
493
492
495
492
41
42
43____04
43____06
43
48
49
492
4881
4882
4883
________ 1882 ________ 1885 ________ 1886
4887
4888
4887
4890
4882
4892
4882
4894
4882
4896
4882
4885
4899
________ 1887 ________ 1901 ________ 1902
4882
4904
43____1904
43____1908
43____1910
43____1901
4913
4904
4915
492
4917
42
43____192
4921
43
435
4904
Java
437
________ 038 ________ 039
440
441
_______03____190
43____191
43
447
492
493
492
495
492
41
43____02
4882
44
4882
46
4882
48
49
492
464
465
466
4887
4883
4887
4885
471
465
473
474
4888
474
4890
4887
4892
4887
4894
4887
4896
4887
4885
486
465
488
474
4901
4902
4887
4904
4882
4904
4882
4908
4882
4910
4882
4901
48802
48803
48804
43____1904
43____1915
43____18810
447
48812
48813
43____02
4882
492
48818
48819
48820
48821
48804
4882
48824
43____1904
4904
con trăn
48828
48829
48830
48831
48832
43
48
48835
48836
48837
48838
465
48840
48802
48803
48843
4882
4885
48846
48847
48835
48849
48849
465
48852
4887
48854
48802
48849
48803
4882
4885
48854
48849
48849
465
48852
4887
4901
48835
43____1901
48802
48803
48872
48846
48849
48819
48854
48849
48821
48879
48880
C#
48881
4933
48883
4933
48885
440
48887
490
491
447
492
493______192
495
492
41
42
43____04
43____06
43
48
49
492
4881
4882
4883
________ 1882 ________ 1885 ________ 1886
4887
4888
4887
4890
4882
4892
4882
4894
4882
4896
4882
4885
4899
________ 1887 ________ 1901 ________ 1902
4882
4904
43____1904
43____1908
43____1910
43____1901
4913
4904
4915
48810
447
48812
48944
42
43____192
4921
_______03____18950
4904
4904
48953
Javascript
48954
48955
490
491
48958
48959
43____02
4882
44
4882
46
4882
48
48968
4887
4883
________ 1887 ________ 1885 ________ 1886
474
4888
474
4890
4887
4892
4887
4894
4887
4896
4887
4885
4899
474
4901
4902
4887
4904
4882
4904
4882
4908
4882
4910
4882
4901
4913
43____1904
4915
49004
49005
4882
49007
49008
Đầu ra
4
Độ phức tạp về thời gian.
Không gian phụ.
Phương pháp tiếp cận hiệu quả. Vấn đề có thể được giải quyết theo cách tối ưu hóa với độ phức tạp sqrt[n] bằng cách sử dụng thực tế là thừa số của bất kỳ số nào vẫn ở dạng cặp. Nói cách khác, nếu tôi là thừa số của số n thì n/i cũng sẽ là thừa số của n. Vì vậy, để tìm tất cả các thừa số của một số, chúng ta cần kiểm tra các thừa số cho đến sqrt[n] và các cặp tương ứng của chúng. Một kiểu tiếp cận tương tự được sử dụng trong bài viết. tìm ước của số tự nhiên
Hình minh họa.
Nếu n = 80 thì tất cả các cặp ước khác nhau có thể có là. [1,80], [2,40], [4,20], [5,16], [8,10]. Do đó để lưu trữ tất cả các thừa số của 80, chúng ta sẽ lặp vòng lặp từ 1 đến √80 ≈ 8 và lưu trữ các thừa số trong phạm vi [trong trường hợp này bao gồm 1,2,4,5,8 ở đây]. Sau đó, chúng tôi chạy một vòng lặp ngược lại và lưu trữ các cặp thừa số trước đó [sẽ cho 10, 16, 20, 40 và 80]. Ở đây chúng tôi đang chạy một vòng lặp ngược lại để chúng tôi có thể nhận được các cặp theo thứ tự tăng dần. Bằng cách này, chúng tôi sẽ nhận được tất cả các yếu tố bao gồm {1, 2, 4, 5, 8, 10, 16, 20, 40 và 80}.
Tiếp cận
- Khởi tạo một vector để lưu trữ các phần tử theo thứ tự tăng dần
- Đầu tiên, lặp lại một vòng lặp từ 1 đến sqrt[n] và lưu trữ tất cả các yếu tố
- Sau đó lặp lại vòng lặp theo thứ tự ngược lại và với mỗi yếu tố lưu trữ cặp tương ứng của nó. Vì vậy, nếu tôi là thừa số thì lưu trữ n/i
- Nếu kích thước của vectơ lớn hơn hoặc bằng k thì trả về hệ số lớn thứ k [sẽ là v[v. size[]-k] vì vectơ v có thứ tự tăng dần]
- Nếu k phần tử không tồn tại có nghĩa là không có phần tử lớn thứ k và do đó trả về -1
Xử lý các trường hợp góc.
Trường hợp góc sẽ phát sinh khi bất kỳ thừa số nào cũng chính xác bằng sqrt[n]. Ví dụ: nếu n=100, thì trong trường hợp này 10 sẽ là thừa số của số và cặp tương ứng của nó cũng là 10 dưới dạng [10*10=100]. Vì vậy, trong trường hợp này 10 sẽ được thực hiện hai lần. Để giải quyết trường hợp này, chúng tôi sử dụng câu lệnh if giữa hai vòng lặp và loại bỏ vấn đề bằng cách chỉ xem xét yếu tố này một lần.
Dưới đây là việc thực hiện các phương pháp trên
C++
4931
49010
4933
4934
4935
490
491
492
493
492
49019
492
49021
42
_______03____19024
_______03____19026
43____19028
492
49030
43____192
4902
43____19035
43____19037
43
48
49040
4882
4885
49043
4887
49045
43____1904
43____19049
43____1885
49052
4882
49054
43____1904
43____08
49059
4882
4885
49043
4887
49064
43____1904
43____19068
43____19070
43____19072
43____19074
43____19076
43____1885
49079
________ 1882 ________ 1901 ________ 19082
43____1904
_______03____19086
_______03____19088
43____19090
4882
4901
4913
4904
4915
492
4917
42
43____192
4921
43
435
4904
49105
Java
________ 038 ________ 039
438
49109
48810
440
49112
42
49114
49114
490
49114
491
49114
447
492
493
492
49019
492
49021
49114
42
43
_______03____19024
_______03____19026
43____19135____19136
49137
43____192
4902
43____19035
43____19037
43
48
49147
48803
49149
49150
4885
49152
465
473
4882
49156
43____1904
43____19049
43____1885
49052
49150
49054
43____1904
43
48
49170
48803
466
49150
4885
49152
465
473
4882
49179
43____1904
43____19068
43____19070
43____19072
43____19074
43____19076
43____1885
49079
49150
4901
49197
43____1904
_______03____19086
_______03____19088
43____19090
49150
4901
48802
48803
48804
49114
4904
49114
48810
447
48812
48813
49114
42
43____192
48818
48819
48820
48821
48804
_______03____18824
49114
4904
4904
49232
Python3
48828
438
49235
49236
48830
48831
49239
49114
_______03____19242
43____19244
43____19246
48849
49248
43____19250
43____19252
43____18835____18849
48803
43____19258
48849
49260
43
48
49263
48836
48837
49306
465
48840
48802
48803
48843