C++: Bài tập phần hàm
Bài tập 1:
Viết chương trình dưới dạng hàm thực hiện các việc sau:
1. Ở hàm main() khai báo 2 biến number1, number2 kiểu float
2. Định nghĩa hàm nhapLieu() để nhập dữ liệu cho 2 biến number1, number2 của hàm main()
3. Định nghĩa hàm tinhTong() để tính tổng của 2 biến number1, number2 của hàm main()
4. Định nghĩa hàm tinhHieu() để tính hiệu của 2 biến number1, number2 của hàm main()
5. Định nghĩa hàm tinhNhan() để tính tích của 2 biến number1, number2 của hàm main()
6. Định nghĩa hàm tinhChia() để tính thương của 2 biến number1, number2 của hàm main()
7. Định nghĩa hàm timUocSoChungLonNhat() để tìm ước số chung lớn nhất của 2 biến number1, number2 của hàm main()
8. Định nghĩa hàm timBoiSoChungNhoNhat() để tìm bội số chung nhỏ nhất của 2 biến number1, number2 của hàm main()
Bài tập 2:
Cho xâu kí tự S, bạn được thực hiện phép biến đổi sau: Chọn hai chỉ số i và j sao cho i>j, thay kí tự ở vị trí thứ i thành kí tự ở vị trí thứ j. Ví dụ, giả sử xâu S là hanh, thì bằng cách chọn i=3 và j=2 ta có thể biến đổi xâu thành haah. Tuy nhiên, bạn không thể biến đổi từ xâu hanh thành hnnh. Cho hai xâu kí tự S và T, bạn được thực hiện phép biến đổi trên không giới hạn số lần. Bạn chỉ cần trả lời có thể biến đổi từ S thành T hay không. Input Gồm hai dòng, dòng đầu chứa xâu S và dòng thứ hai chứa xâu T. Hai xâu S và T có cùng độ dài, mỗi xâu chứa từ 1 đến 1000 ký tự và chỉ gồm các chữ cái thường. Output In ra Yes nếu không thể đổi xâu S sang xâu T, hoặc No nếu ngược lại.
Đáp án tham khảo:
Để xác định xem có thể biến đổi xâu S thành xâu T thông qua các phép biến đổi cho trước (thay thế ký tự ở vị trí i bằng ký tự ở vị trí j nếu i > j), ta cần phân tích cấu trúc của xâu S và T.
Điều kiện để có thể biến đổi:
- Nếu một ký tự xuất hiện trong xâu T, thì phải có ít nhất một ký tự giống nó xuất hiện trong xâu S, bởi vì chúng ta chỉ có thể thay thế một ký tự bằng một ký tự khác trong xâu S.
- Nếu xâu T chứa vài ký tự, nhưng các ký tự này không tồn tại trong xâu S, thì không thể thực hiện phép biến đổi.
Cách tiếp cận giải quyết bài toán:
- Đếm số lần xuất hiện của mỗi ký tự trong hai xâu S và T.
- So sánh các ký tự của xâu T với các ký tự của xâu S.
- Nếu tất cả các ký tự trong T có thể được tìm thấy trong S với số lượng tối thiểu tương ứng, in ra "No". Ngược lại, in ra "Yes".
Mã giả
Dưới đây là một đoạn mã C++ thể hiện cách kiểm tra:
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
bool canTransform(const string &S, const string &T) {
unordered_map<char, int> countS, countT;
// Đếm số lượng ký tự trong S
for (char c : S) {
countS[c]++;
}
// Đếm số lượng ký tự trong T
for (char c : T) {
countT[c]++;
}
// So sánh số lượng ký tự
for (auto &pair : countT) {
char c = pair.first;
if (countS[c] < pair.second) {
return false; // Nếu số lượng ký tự thiếu, không thể biến đổi
}
}
return true; // Có thể biến đổi
}
int main() {
string S, T;
// Đọc dữ liệu
cin >> S >> T;
// Gọi hàm kiểm tra và in kết quả
if (canTransform(S, T)) {
cout << "No" << endl; // Có thể biến đổi nghĩa là không có điều gì trở ngại
} else {
cout << "Yes" << endl; // Không thể biến đổi
}
return 0;
}