Giải đề thi học sinh giỏi tin lớp 12-Lâm Đồng (Phần 2)
Tên kỳ thi
Kỳ thì chọn học sinh giỏi cấp tỉnh lớp 12, năm học 2021 – 2022. Sở Giáo dục và Đào tạo Lâm Đồng.
Ngày thi
Ngày: 07/01/2022.
Đề bài
Câu 2: Tên file bài làm: FIB2.*
Xâu Fibonacci thường được sử dụng để rèn luyện kỹ năng xử lý khi giới thiệu các giải thuật xử lý xâu. Xét dãy xâu F0, F1, F2, … xây dựng theo quy tắc sau:
- F0 = ‘a’
- F1 = ‘b’
- Fn = Fn – 2 + Fn – 1
Yêu cầu: Cho hai số nguyên n và k (0 ≤ k ≤ 45, k không vượt quá độ dài xâu Fn). Hãy xác định số lượng ký tự a xuất hiện trong k ký tự đầu tiên của xâu Fn
Dữ liệu vào: từ file văn bản FIB2.INP
- Dòng đầu ghi số nguyên T là số test cần xử lý (1 ≤ T ≤ 100)
- Mỗi dòng trong T dòng sau ghi hai số n và k cách nhau ít nhất một dấu cách.
Kết quả: Ghi ra file văn bản FIB2.OUT
- Ứng với mỗi test trên một dòng dưới dạng một số nguyên.
Hướng dẫn làm bài
Thầy sử dụng ngôn ngữ lập trình Python nên thầy sẽ có hướng tiếp cận của Python. Các em làm bài bằng C/C++ thì có thể có cách trình bày khác thầy.
Bài này có 2 giai đoạn:
-
- Giai đoạn 1:
Xác định dãy Fibonacci.
- Giai đoạn 2:
Đếm số lần xuất hiện ‘a’ trong k ký tự đầu tiên của dãy Fibinacci vừa tìm được (mỗi trường hợp sẽ có một dãy Fibonacci khác nhau).
Code tham khảo
# Xây dựng hàm
"""
Hàm khởi tạo Fibo
"""
def Fibo(n):
if n == 0:
return "a"
elif n == 1:
return "b"
else:
return Fibo(n - 2) + Fibo(n - 1)
"""
Hàm đếm số lượng ký tự a
"""
def Count_a(fibo, k):
count = 0
for i in range(k):
if fibo[i] == 'a':
count += 1
return count
# ===main===
if __name__ == '__main__':
# Mở file
f_i = open("FIB2.INP", mode="r")
f_o = open("FIB2.OUT", mode="w")
# Đọc số lượng các trường hợp
n = int(f_i.readline())
# Đọc lần lượt từng dòng của từng trường hợp
for i in range(n):
line = f_i.readline()
lst = line.split(" ")
# Xác định n, k và dãy Fibo
n = int(lst[0])
k = int(lst[1])
fibo = Fibo(n)
# Xác định số lượng a thỏa mãn
count_a = Count_a(fibo, k)
# Hiển thị ra màn hình
print("Day Fibo tai F", n, " la: ", fibo, " - Số lượng a thoa man la: ", count_a, sep="")
# In ra tệp đầu ra
f_o.writelines(str(count_a) + "\n")
# Đóng tệp
f_i.close()
f_o.close()
Tham khảo
Cùng trong một đề này, bài 1