Công nghệ Về bài toán coin changing

daocongdoan

Học sinh mới
Thành viên
2 Tháng mười một 2022
1
0
1
23
Hải Dương
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

em đang viết code cho bài toán này nhưng bị lỗi, mong mọi người giúp đỡ ạ

#include<iostream>
using namespace std;
bool coin_changing(int *C,int m,int n,int *S)
{
for(int i=0;i<n;i++)
{
cout<<S;
}
int i=0;
while(n>0 &&i<m)
{
S=n/C;
n=n/C;
i++;
}
if(n>0) return false;
else return true;
}
int main()
{
int m,n;
cin>>m>>n;
int *C= new int[n];
for(int i=0;i<n;i++)
{
cout<<C;
}
if(coin_changing(int *C,int m,int n,int *S))
{
int *S=new int[n];
for(int i=0;i<n;i++)
{
cout<<S=" ";
}
}
else
cout<<"error";
}
 

lengoctutb

Học sinh tiến bộ
Thành viên
28 Tháng hai 2016
1,372
990
271
em đang viết code cho bài toán này nhưng bị lỗi, mong mọi người giúp đỡ ạ

#include<iostream>
using namespace std;
bool coin_changing(int *C,int m,int n,int *S)
{
for(int i=0;i<n;i++)
{
cout<<S;
}
int i=0;
while(n>0 &&i<m)
{
S=n/C;
n=n/C;
i++;
}
if(n>0) return false;
else return true;
}
int main()
{
int m,n;
cin>>m>>n;
int *C= new int[n];
for(int i=0;i<n;i++)
{
cout<<C;
}
if(coin_changing(int *C,int m,int n,int *S))
{
int *S=new int[n];
for(int i=0;i<n;i++)
{
cout<<S=" ";
}
}
else
cout<<"error";
}
daocongdoan
Đoạn code của bạn đang mắc khá nhiều lỗi từ cú pháp cho đến logic thuật toán. Mình sẽ phân tích chi tiết từng điểm để bạn nắm rõ nhé:

1. Lỗi thao tác với mảng/con trỏ:

  • S = n / C; và n = n / C;: S và C là các mảng (con trỏ), bạn không thể lấy một số nguyên n chia cho một mảng được. Bạn phải thao tác trên từng phần tử cụ thể bằng cách dùng chỉ số i, ví dụ: S = n / C;.
    [*]Để tính số tiền còn lại sau khi đã lấy số lượng đồng xu S, bạn phải dùng phép chia lấy dư (modulo) % thay vì phép chia lấy nguyên /. Logic đúng phải là: n = n % C;.

2. Lỗi Nhập/Xuất dữ liệu (cin/cout):

  • Trong hàm main, bạn viết cout << C; ở vòng lặp nhập mảng. Lệnh này sẽ in ra địa chỉ bộ nhớ của con trỏ C thay vì cho phép bạn nhập giá trị. Để nhập dữ liệu từ bàn phím vào mảng, bạn phải dùng cin >> C;.
    [*]Tương tự, ở cuối bài cout << S = " "; là sai cú pháp hoàn toàn. Cách viết đúng để in phần tử mảng kèm khoảng trắng là cout << S << " ";.

3. Lỗi gọi hàm (Function Call):

  • Khi gọi hàm ở câu lệnh if, bạn viết: if(coin_changing(int *C, int m, int n, int *S)). Khi gọi hàm, bạn chỉ được truyền tên biến (giá trị), không được mang cả kiểu dữ liệu (int, int *) vào. Cú pháp đúng là: if(coin_changing(C, m, n, S)).
4. Lỗi cấp phát bộ nhớ và kích thước mảng:

  • Quy ước bài toán: m là số lượng loại tiền, n là tổng số tiền cần đổi. Vậy mảng C (các mệnh giá) và mảng S (số lượng tương ứng) phải có kích thước là m, không phải n.
  • Bạn gọi hàm coin_changing và truyền S vào trong khi mảng S chưa hề được khởi tạo cấp phát bộ nhớ trước đó.
Dưới đây là đoạn code mình sửa lại:

#include <iostream>
using namespace std;

// Hàm tính toán đổi tiền
bool coin_changing(int *C, int m, int n, int *S) {
int i = 0;

// Duyệt qua từng loại tiền (từ mệnh giá lớn đến nhỏ)
while (n > 0 && i < m) {
S = n / C; // Số lượng đồng tiền loại C có thể lấy
n = n % C; // Cập nhật lại số tiền còn lại cần đổi
i++;
}

// Nếu duyệt hết các loại tiền mà số tiền n vẫn > 0, tức là không thể đổi chẵn
if (n > 0) return false;
else return true;
}

int main() {
int m, n;
// Nhập m: số lượng loại tiền, n: số tiền cần đổi
cin >> m >> n;

// Cấp phát động mảng C và S với kích thước m (số loại tiền)
int *C = new int[m];
int *S = new int[m];

// Khởi tạo mảng S ban đầu toàn số 0
for(int i = 0; i < m; i++) {
S = 0;
}

// Nhập các mệnh giá tiền (C)
for (int i = 0; i < m; i++) {
cin >> C;
}

// Gọi hàm truyền đúng tên biến
if (coin_changing(C, m, n, S)) {
// In kết quả mảng S
for (int i = 0; i < m; i++) {
cout << S << " ";
}
} else {
cout << "error";
}

// Giải phóng bộ nhớ sau khi dùng xong để tránh rò rỉ (memory leak)
delete[] C;
delete[] S;

return 0;
}
 
Top Bottom