Tiền tệ của Mỹ có các đồng xu có mệnh giá 1 [đồng xu], 5 [nickel], 10 [dimes] và 25 cent [quý]. Hãy tưởng tượng rằng chúng tôi đang lập trình một máy tính tiền để phân phát tiền lẻ chính xác. Trong bài tập này, chúng ta sẽ cần tính số lượng của mỗi đồng xu cho một lượng thay đổi nhất định
Mô tả bài tập
Viết hàm makeChange[]
với tham số số tiền. Tham số amount
chứa một số nguyên của số xu để thực hiện thay đổi cho. Ví dụ: 30
sẽ đại diện cho 30 xu và 125 sẽ đại diện cho 1 đô la. 25. Hàm này sẽ trả về một từ điển có các khóa 'quarters'
, 'dimes', 'nickels'
và 'penny', trong đó giá trị của khóa là một số nguyên của loại tiền này
Giá trị cho khóa của một đồng xu không bao giờ được 0
. Thay vào đó, khóa không nên có trong từ điển. Ví dụ: makeChange[5] sẽ trả về {'nickels'. 1} chứ không phải {'phần tư'. 0, 'đồng xu'. 0, 'nickel'. 1, 'đồng xu'. 0}
Ví dụ: makeChange[30]
sẽ trả về từ điển {'quarters': 1, 'nickels': 5}
để đại diện cho các đồng xu được sử dụng để đổi 30 xu. Chức năng nên sử dụng số lượng tiền tối thiểu. Ví dụ: makeChange[10]
sẽ trả về {'dimes': 1}
chứ không phải {'nickels'. 2}, mặc dù cả hai đều cộng lại tới 10 xu
Các câu lệnh amount
0 Python này dừng chương trình nếu điều kiện của chúng là amount
1. Sao chép chúng vào cuối chương trình giải pháp của bạn. Giải pháp của bạn là đúng nếu tất cả các điều kiện của câu lệnh amount
0 sau đây đều đúng
khẳng định makeChange[30] == {'quý'. 1, 'nickel'. 1}
khẳng định makeChange[10] == {'dimes'. 1}
khẳng định makeChange[57] == {'quý'. 2, 'nickel'. 1, 'đồng xu'. 2}
khẳng định makeChange[100] == {'quý'. 4}
khẳng định makeChange[125] == {'quý'. 5}
Cố gắng viết một giải pháp dựa trên thông tin trong mô tả này. Nếu bạn vẫn gặp khó khăn khi giải bài tập này, hãy đọc phần Thiết kế giải pháp và Các trường hợp đặc biệt và Gotchas để biết thêm gợi ý
khái niệm tiên quyết. toán tử modulo, phép chia số nguyên
giải pháp thiết kế
Đầu tiên, hàm makeChange[]
của chúng ta sẽ tạo một từ điển trống trong một biến có tên là amount
4 để lưu kết quả trả về. Tiếp theo, chúng ta cần xác định số lượng của từng loại tiền xu, bắt đầu với mệnh giá lớn nhất [25 phần tư xu] đến nhỏ nhất [đồng xu 1 xu]. Bằng cách này, chúng tôi không vô tình sử dụng nhiều hơn số lượng xu tối thiểu bằng cách xác định chúng tôi cần, chẳng hạn như hai xu 5 xu thay vì một xu 10 xu
Hãy bắt đầu với quý. Trước khi thực hiện bất kỳ phép tính nào, nếu lượng thay đổi cần thực hiện nhỏ hơn 25, thì chúng ta có thể bỏ qua phép tính này hoàn toàn vì không có phần tư nào. Mặt khác, nếu lượng thay đổi cần thực hiện chia hết cho 25, giả sử tham số amount
là amount
6, thì chúng ta có thể xác định số phần tư bằng cách chia amount
cho amount
8. 125/25 đánh giá là amount
9
Tuy nhiên nếu nó không chia hết cho 25 thì kết quả của ta sẽ có phần phân số. 30
0 đánh giá là 5. 4. Chúng tôi chỉ có thể thêm số nguyên của phần tư vào thay đổi của mình, không phải 0. 4 quý. Sử dụng toán tử chia số nguyên 30
1, chúng tôi có thể đảm bảo rằng chúng tôi chỉ đưa toàn bộ số xu vào từ điển thay đổi của mình. cả 30
2 và 135 // 25 đánh giá bằng 30
3
Để khấu trừ số tiền thay đổi được giữ trong các quý, chúng tôi có thể đặt thay đổi thành số tiền còn lại sau khi loại bỏ 25 xu gia số. Từ “còn lại” gợi ý rằng chúng ta nên sử dụng toán tử modulo 30
4. Ví dụ: nếu chúng tôi cần đổi 135 xu và sử dụng 5 phần tư cho 125 xu trong số đó, thì chúng tôi sẽ cần sử dụng các đồng xu khác cho 135 % 25 hoặc 30
5 xu còn lại
Điều này xử lý tính toán số phần tư được sử dụng để thực hiện thay đổi. Sau đó, chúng tôi sẽ sao chép-dán mã này và thực hiện các sửa đổi đối với hào, biệt hiệu và đồng xu [theo thứ tự đó]. Khi chúng tôi xử lý xong số lượng đồng xu, tham số amount
sẽ là 0 và từ điển amount
4 sẽ chứa số tiền chính xác của mỗi đồng xu
Trường hợp đặc biệt và Gotchas
Bởi vì bài tập này xác định rằng tiền lẻ phải được thực hiện từ số lượng tiền xu tối thiểu, nên chỉ có một câu trả lời đúng cho bất kỳ lượng tiền lẻ nào. Điều quan trọng nhất cần làm đúng trong thuật toán này là tính toán các đồng xu theo thứ tự từ lớn nhất đến nhỏ nhất, nếu không, bạn sẽ rơi vào tình huống chẳng hạn như bạn sử dụng hai đồng xu thay vì một đồng xu
Ngoài ra, hãy nhớ sử dụng toán tử chia số nguyên 30
1 thay vì toán tử chia 30
9 để tính số xu. Toán tử chia thông thường của Python đánh giá các số dấu phẩy động, có thể chứa một phần phân số. [Ngay cả khi không, Python vẫn đánh giá kết quả là float. 125/25 đánh giá số float amount
9 chứ không phải số nguyên 30
3. ] Phép chia số nguyên luôn đánh giá thành số nguyên và không có vấn đề tiềm ẩn này
Vì đồng xu đại diện cho 1 xu, nên bạn có thể đặt số lượng đồng xu thay đổi thành bất kỳ giá trị nào của tham số amount
ở cuối hàm miễn là nó lớn hơn 0
Bây giờ hãy thử viết một giải pháp dựa trên thông tin trong các phần trước. Nếu bạn vẫn gặp khó khăn khi giải bài tập này, hãy đọc phần Mẫu giải pháp để biết thêm gợi ý
Mẫu giải pháp
Trước tiên hãy thử viết một giải pháp từ đầu. Nhưng nếu bạn gặp khó khăn, bạn có thể sử dụng chương trình một phần sau đây làm nơi bắt đầu. Sao chép đoạn mã sau từ https. //invpy. com/makechange-mẫu. py và dán nó vào trình chỉnh sửa mã của bạn. Thay thế dấu gạch dưới bằng mã để tạo chương trình hoạt động
def makeChange[số tiền]
thay đổi = ____
nếu số tiền >= ____
thay đổi['quý'] = số tiền // ____
số tiền = số tiền % ____
nếu số tiền >= ____
thay đổi['dimes'] = ____ // ____
số tiền = ____ % ____
nếu số tiền >= ____
thay đổi['nickels'] = ____ // ____
số tiền = ____ % ____
nếu số tiền >= 1
thay đổi[____] = số tiền
đổi trả
Giải pháp hoàn chỉnh cho bài tập này được đưa ra trong Phụ lục A và https. //invpy. com/makechange. py. Bạn có thể xem từng bước của chương trình này khi nó chạy dưới trình gỡ lỗi tại https. //invpy. com/makechange-debug/