Làm sao để xuất mảng con chỉ gồm các số nguyên tố và dài nhất?

Em có một bài tập sau chưa làm được mọi người giúp em nhé

  1. Xuất ra đoạn con dài nhất chứa toàn số nguyên tố
    ví dụ : mảng 9 chữ số : 5,5,7,8,9,7,5,3,2=> xuất ra : 7,5,3,2
    Cảm ơn mọi người !
    Tiện cho em hỏi sao clip của anh Đạt trên youtube phần C++ k nge tiếng đc v :frowning:

Duyệt mảng, kiểm tra nguyên tố rồi xuất ra :wink:

cái này là xuất đoạn con dài nhất a ơi, ví dụ của em là có 2 đoạn con, 1 đoạn con có 3 ptử là {5,5,7} còn đoạn còn lại 4 ptử {7,5,3,2}. Đoạn sau dài hơn đoạn đầu nên xuất đoạn sau ra

a @ltd vào cứu e :running:

Đoạn dài nhất sẽ là đoạn được xét từ đầu đến cuối thôi chứ sao nữa. Nếu yêu cầu thêm điều kiện chuỗi nguyên tố này phải tăng hoặc giảm dài nhất thì mới cần dùng quy hoạch động. Chứ chỉ có mỗi điều kiện là số nguyên tố thì dùng quy hoạch động làm gì cho tốn công.
Sao bạn không chọn ra đoạn 5 5 7 7 5 3 2 cho dài?

bạn k hiểu ý đề bài r, nghĩa là đề bài cho 1 mảng n ptử thì mình kiếm đoạn con nào đó sao cho thỏa đoạn vừa là số nguyên tố và đoạn con đó phải dài nhất so với các đoạn con số nguyên tố khác. Nếu mà đoạn dài nhất là đoạn được xét từ đầu đến cuối thì dễ r

Là đoạn liên tục à? Thế thì cứ kiểm tra đến phần tử nào là số nguyên tố thì bắt đầu từ đó thôi. Cứ kiểm tra next element xem có phải là nguyên tố không, phải thì tăng độ dài lên 1. Sau khi gặp phần tử không phải nguyên tố thì so sánh độ dài đó với max_length.

à nếu so sánh thì mình làm được r, bây h đang k biết cách làm sao xuất ra các ptử của đoạn liên tục dài nhất đó

Bạn lưu chỉ số phần tử bắt đầu đoạn dãy nguyên tố con đó. Nếu đó là đoạn có độ dài lớn nhất thì bạn in mảng từ chỉ số đó đến khi gặp phần tử không phải là số nguyên tố hoặc kết thúc mảng thì thôi.

đây là đoạn code kiểm tra đoạn liên tục dài nhất, bạn thêm giúp mình phần xuất các ptử ra được k

int cau1(int a[], int n)
{
	int d=0,max=0;
	for (int i=0; i<n; i++)
	if(nguyento(a[i])) d++;
	else 
	{
		if (d>max) max=d;
		d=0;
	}
	return(d>max?d:max);
}

bạn cần 1 biến lưu lại chỉ số đầu tiên của dãy dài nhất nữa

#include <iostream>
using namespace std;

bool SNT(int n)	{
	
	if(n < 2)
		return 0;
	
	for(int i = 2; i*i <= n; i++)	{
		
		if(n%i == 0)	
			return 0;
	}
	
	return 1;
}

int main() {
	
	int a[] = { 5,5,7,8,9,7,5,3,2 };
	int n = sizeof(a)/sizeof(n);
	int max_length = 0,index = -1;
	
	for(int i = 0; i < n; i++)	{
		
		if(SNT(a[i]))	{
			
			int length = 1,temp_index = i;
			while(SNT(a[i+1]))	{
				
				length++;
				i++;
			}
			
			if(max_length < length)	{
				
				max_length = length;
				index = temp_index;
			}
		}
	}
	
	for(int i = index; i < n; i++)    {
		if(SNT(a[i]))
			cout << a[i] << " ";
                else
                        break;
        }
			
	cout << endl;
	cout << "Max length: " << max_length << endl;
	return 0;
}
1 Like
for(int i = index; i < n; i++)    {
		if(SNT(a[i]))
			cout << a[i] << " ";
                else
                        break;
        }

chỗ này mình nghĩ là sửa như này thì ổn hơn:

for(int i = index; i < max_length+index; i++)
	cout << a[i] << " ";
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?