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

Cho hai số nguyên dương L và R. Yêu cầu: Tìm số nguyên dương M (L M R) để chênh lệch giữa tổng các số nguyên dương liên tiếp từ L đến M và tổng các số nguyên dương liên tiếp từ M+1 đến R là nhỏ nhất

Cho hai số nguyên dương L và R. Yêu cầu: Tìm số nguyên dương M (L M R) để chênh lệch giữa tổng các số nguyên dương liên tiếp từ L đến M và tổng các số nguyên dương liên tiếp từ M+1 đến R là nhỏ nhất.
viết code c++
nhanh nha mình cần gấp
2 trả lời
Hỏi chi tiết
106
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Dưới đây là một đoạn mã C++ để tìm số nguyên dương M sao cho chênh lệch giữa tổng các số từ L đến M và tổng các số từ M+1 đến R là nhỏ nhất.

```cpp
#include
#include

using namespace std;

// Hàm tính tổng từ a đến b
long long sum(int a, int b) {
return (b - a + 1) * (a + b) / 2;
}

int main() {
int L, R;
cout << "Nhap hai so nguyen duong L va R: ";
cin >> L >> R;

int optimalM = L;
long long minDifference = LLONG_MAX;

// Duyệt từ L đến R để tìm M tối ưu
for (int M = L; M <= R; M++) {
long long sum1 = sum(L, M);
long long sum2 = sum(M + 1, R);
long long difference = abs(sum1 - sum2);

if (difference < minDifference) {
minDifference = difference;
optimalM = M;
}
}

cout << "Gia tri M toi uu la: " << optimalM << endl;
cout << "Chenh lech nho nhat la: " << minDifference << endl;

return 0;
}
```

### Hướng dẫn sử dụng:
1. Sao chép mã nguồn trên vào một file có đuôi `.cpp`.
2. Biên dịch file này bằng trình biên dịch C++ (như g++).
3. Chạy chương trình và nhập giá trị cho L và R khi được yêu cầu.

### Chú thích:
- Hàm `sum` sử dụng công thức tổng của các số nguyên để tính toán nhanh tổng từ `a` đến `b`.
- Chương trình sẽ tìm giá trị M trong khoảng từ L đến R sao cho chênh lệch giữa tổng từ L đến M và tổng từ M+1 đến R là nhỏ nhất.

Hãy đảm bảo rằng bạn nhập đúng hai số nguyên dương L và R.
1
0
Ngoc Trinh
25/07 08:51:21
+5đ tặng
Bước 1: Cắt mảng làm 2 phần bằng nhau
- VD: dãy A = [1, 2, 3, 4] thì được cắt thành [1, 2] và [3, 4]
Bước 2: XÉT từng phần của mảng:
- Nếu phần ĐANG ĐƯỢC XÉT chỉ có 1 phần tử: Xử lý bài toán
- Ngược lại:
Bước 3: Cắt phần đó làm đôi
Bước 4: quay về bước 2
Chặt nhị phân là 1 phép chia để trị.
Code chặt nhị phân (trong Pascal) sẽ là như sau:
procedure BinarySearch(startnum, endnum: longint);
var midnum: longint;
begin
if (startnum = endnum) then
xử_lý_bài_toán
else begin
midnum := (startnum + endnum) div 2;
BinarySearch(startnum, midnum);
BinarySearch(midnum + 1, endnum);
end;
end;
Trong đó startnum là số đầu, endnum là số cuối, midnum là trung bình cộng của 2 số.
Cộng thêm điều kiện của đề bài, code sẽ như sau (mình chỉ làm sample thôi nha):
procedure BinarySearch(startnum, endnum: longint);
var midnum, x: longint;
begin
if (startnum = endnum) then
begin //Xử lý bài toán
x := abs(Sum(L, startnum) – Sum(startnum + 1, R));
if (x < min) then
min := x;
end
else begin //Tiếp tục chặt nhị phân, tách phần được xét làm đôi
midnum := (startnum + endnum) div 2;
BinarySearch(startnum, midnum);
BinarySearch(midnum + 1, endnum);
end;
end;
begin

Start(L, R);

end.
Trong đó: Sum(x, y) là tổng các số nguyên từ x đến y.

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
0
0
hintea
25/07 22:14:00
+4đ tặng
Bước 1: Cắt mảng làm 2 phần bằng nhau
Bước 2: XÉT từng phần của mảng:
Bước 3: Cắt phần đó làm đôi
Bước 4: quay về bước 2

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 Lớp 7 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