Bài tập  /  Bài đang cần trả lời

Tin học - Lớp 8
20/10/2023 15:33:55

Em hãy tìm dãy số đặc biệt dài nhất bắt đầu từ N?

Dãy số A 1, A 2,..., A n được gọi là dãy số đặc biệt nếu nó thoả mãn các điều kiện:
 Là dãy số giảm dần;
 Với mỗi a i thì a i hoặc là số nguyên tố hoặc là ước của một trong các số từ a 1 đến a i-1 .
Em hãy tìm dãy số đặc biệt dài nhất bắt đầu từ N?
 
1 trả lời
Hỏi chi tiết
56
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Để tìm dãy số đặc biệt dài nhất bắt đầu từ N, ta có thể sử dụng phương pháp đệ quy.

Đầu tiên, ta kiểm tra xem N có phải là số nguyên tố hay không. Nếu N là số nguyên tố, ta có thể tạo một dãy số đặc biệt chỉ gồm một phần tử là N.

Nếu N không phải là số nguyên tố, ta sẽ tìm tất cả các ước của N và kiểm tra xem chúng có phải là số nguyên tố hay không. Sau đó, ta sẽ đệ quy tìm dãy số đặc biệt dài nhất bắt đầu từ mỗi ước của N và chọn dãy có độ dài lớn nhất.

Dưới đây là một đoạn mã Python minh họa cho phương pháp đệ quy này:

```python
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True

def find_longest_special_sequence(n):
if is_prime(n):
return [n]

longest_sequence = []
for i in range(1, n):
if n % i == 0 and is_prime(i):
sequence = find_longest_special_sequence(i)
if len(sequence) > len(longest_sequence):
longest_sequence = sequence

return longest_sequence + [n]

n = int(input("Nhập số N: "))
sequence = find_longest_special_sequence(n)
print("Dãy số đặc biệt dài nhất bắt đầu từ", n, "là:", sequence)
```

Với đoạn mã trên, ta nhập số N từ người dùng và sau đó tìm dãy số đặc biệt dài nhất bắt đầu từ N. Kết quả sẽ được in ra màn hình.

Lưu ý rằng đoạn mã trên chỉ tìm dãy số đặc biệt dài nhất bắt đầu từ N, không phải tất cả các dãy số đặc biệt có thể tạo từ N.
0
1
rén
20/10/2023 15:36:16
+5đ tặng

Ta cần tìm cách để thêm nhiều số nhất vào mảng ans kết quả của chúng ta.

Đầu tiên, ans = {N}

Dễ thấy, ta cần thêm tất cả các số nguyên tố từ 2 đến N (do các số bé hơn 2 ko thể nguyên tố) vào dãy ans. Do các số này đều là số nguyên tố nên dãy số ans sẽ luôn thỏa mãn.

Vậy còn "với mỗi a[i] thì a[i] là ước của 1 trong các số từ a[1] -> a[i-1]" thì sao? Ta thấy, các số nguyên tố luôn lớn hơn 2 và chỉ có 1 ước khác nó là 1. Vậy ta thêm 1 vào dãy ans. Ta không thể thêm bất kỳ số nào là ước khác của các số nguyên tố được thêm vào trước đó. Điều đó dẫn tới các số thêm vào chỉ còn có thể là ước của N.

Vậy tóm lại, ta cần thêm tất cả các SNT từ 1->N và tất cả các ước của N, sau đó xóa đi các phần tử bị lặp lại (sử dụng set) và sắp xếp lại dãy ans. Như vậy sẽ ra được kết quả.

Code (C++)

#include <bits/stdc++.h>
using namespace std;

int isPrime(int n){
    // Khong can if(n < 2) return false do ta se khong xet toi n < 2
    if(n < 4) return true;
    for(int i=2;i*i<=n;i++)
        if(n % i == 0) return false;
    return true;
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    freopen("DAYSO.IN","r",stdin);
    freopen("DAYSO.OUT","w",stdout);

    int n; cin >> n;
    set<int> ans = {n,1}; // luon co 1 trong day ans
    // Tim tat ca cac SNT tu 2->n-1 (khong can n do n da co trong ans)
    for(int i=2;i<n;i++)
        if(isPrime(i)) ans.insert(i);
    // Tim tat ca cac uoc cua n
    for(int i=2;i*i<=n;i++)
    if(n % i == 0) {ans.insert(i); ans.insert(n/i);}
    // Sap xep lai ans
    vector<int> out(ans.begin(),ans.end());
    sort(out.begin(),out.end(),greater<int>());
    // In ra kq
    for(int i: out) cout << i << ' ';
    return 0;

Mở khóa để xem toàn bộ nội dung trả lời

(?)
Bạn đã đạt đến giới hạn của mình. Bằng cách Đăng ký tài khoản, bạn có thể xem toàn bộ nội dung trả lời
Cải thiện điểm số của bạn bằng cách đăng ký tài khoản Lazi.
Xem toàn bộ các câu trả lời, chat trực tiếp 1:1 với đội ngũ Gia sư Lazi bằng cách Đăng ký tài khoản ngay bây giờ
Tôi đã có tài khoản? Đăng nhập

Bạn hỏi - Lazi trả lời

Bạn muốn biết điều gì?

GỬI CÂU HỎI
Học tập không giới hạn cùng học sinh cả nước và AI, sôi động, tích cực, trải nghiệm
Câu hỏi Tin học mới nhất

Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi

Vui Buồn Bình thường

Học ngoại ngữ với Flashcard

×
Gia sư Lazi Gia sư
×
Trợ lý ảo Trợ lý ảo