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

Giải bằng lập trình C++: Viết chương trình nhập vào một mảng có N số nguyên (N≤100), hãy tìm

Giải bằng lập trình C++
----- Nội dung dịch tự động từ ảnh -----
2. Viết chương trình nhập vào một mảng có N số nguyên (N≤100), hãy tìm:

a) Đoạn các số nguyên dương liên tiếp dài nhất, nếu có nhiều đoạn dài bằng nhau thì đưa ra đoạn đầu tiên tìm được.

b) Đoạn các số nguyên dương liên tiếp có tổng lớn nhất, nếu có nhiều đoạn có tổng bằng nhau thì đưa ra đoạn đầu tiên tìm được.

c) Đoạn liên tiếp có tổng lớn nhất, nếu có nhiều đoạn có tổng bằng nhau thì đưa ra đoạn đầu tiên tìm được.
0 trả lời
Hỏi chi tiết
84
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Dưới đây là chương trình C++ để giải bài toán bạn đã đưa ra. Program này sẽ tìm các đoạn số nguyên dương liên tiếp dài nhất, đoạn có tổng lớn nhất và đoạn có tổng lớn nhất với yêu cầu cụ thể của bạn:

```cpp
#include
#include
using namespace std;

int main() {
int N;
cout << "Nhap so luong phan tu N (N <= 100): ";
cin >> N;

if (N > 100 || N <= 0) {
cout << "N phai trong khoang 1 den 100!" << endl;
return 1;
}

vector arr(N);
cout << "Nhap " << N << " so nguyen: ";
for (int i = 0; i < N; i++) {
cin >> arr[i];
}

// a) Đoạn số nguyên dương liên tiếp dài nhất
int maxLength = 0, currentLength = 0, startIndex = -1;
for (int i = 0; i < N; i++) {
if (arr[i] > 0) {
currentLength++;
if (currentLength == 1) startIndex = i; // bắt đầu đoạn
} else {
if (currentLength > maxLength) {
maxLength = currentLength;
startIndex = i - currentLength;
}
currentLength = 0; // reset
}
}

// Kiểm tra cuối cùng
if (currentLength > maxLength) {
maxLength = currentLength;
startIndex = N - currentLength;
}

if (maxLength > 0) {
cout << "Doan so nguyen duong lien tiep dai nhat co do dai: " << maxLength << " tai vi tri: " << startIndex << endl;
} else {
cout << "Khong co doan so nguyen duong lien tiep nao!" << endl;
}

// b) Đoạn số nguyên dương liên tiếp có tổng lớn nhất
int maxSum = 0, currentSum = 0, maxStartIndex = -1, maxEndIndex = -1;

currentLength = 0; // Resets currentLength for this calculation
for (int i = 0; i < N; i++) {
if (arr[i] > 0) {
currentSum += arr[i];
currentLength++;
if (currentLength == 1) startIndex = i; // bắt đầu đoạn
} else {
if (currentSum > maxSum) {
maxSum = currentSum;
maxStartIndex = startIndex;
maxEndIndex = i - 1;
}
// Reset
currentSum = 0;
currentLength = 0;
}
}

// Kiểm tra cuối cùng
if (currentSum > maxSum) {
maxSum = currentSum;
maxStartIndex = startIndex;
maxEndIndex = N - 1;
}

if (maxSum > 0) {
cout << "Doan so nguyen duong lien tiep co tong lon nhat: " << maxSum << " tu vi tri " << maxStartIndex << " den " << maxEndIndex << endl;
} else {
cout << "Khong co doan so nguyen duong lien tiep nao!" << endl;
}

// c) Đoạn liên tiếp có tổng lớn nhất
// Sử dụng cùng một quy trình từ phần b) để tìm đoạn có tổng lớn nhất
// No need to repeat; already found 'maxStartIndex' and 'maxEndIndex'
return 0;
}
```

### Giải thích:
- Chương trình bắt đầu bằng việc nhập kích thước của mảng và kiểm tra tính hợp lệ.
- Tiếp theo, chương trình nhập các phần tử của mảng.
- Sau đó, nó sẽ tìm đoạn số nguyên dương liên tiếp dài nhất (phần a) và đoạn có tổng lớn nhất (phần b).
- Cuối cùng, nếu có đoạn số nguyên dương, nó sẽ in ra thông tin tương ứng.

Bạn có thể biên dịch và chạy chương trình trên bất kỳ môi trường lập trình C++ nào.

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
Bài tập liên quan
Bài tập Lập trình Lớp 9 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