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

Giải bài có thưởng!

An đã nghĩ ra một nhiệm vụ cho bản thân để thư giãn một chút. Anh ta chọn hai số nguyên dương a và b, rồi tính ước số chung lớn nhất của các số nguyên “a giai thừa” và “b giai thừa”, tức là An muốn tìm ƯCLN(ư!,b!). Bạn có thể giải quyết được nhiệm vụ của An không?

Bài 3. Thư giãn (tệp chương trình: gcd .pas nếu ngôn ngữ lập trình là Pascal, gcd .cpp nếu ngôn
ngữ lập trình là C++, gcd .py nếu ngôn ngữ lập trình là Python)

An đã nghĩ ra một nhiệm vụ cho bản thân để thư giãn một chút. Anh ta chọn hai số nguyên dương a
b, rồi tính ước số chung lớn nhất của các số nguyên “a giai thừa” và “b giai thừa”, tức là An muốn tìm
ƯCLN(ư!,b!).

Ta biết rằng giai thừa của số nguyên dương n, kí hiệu là n!, là tích của tất cả các số nguyên dương nhỏ
hơn hoặc bằng n. Như vậy n! = 1x2x ...X (n — 1) Xn. Ví dụ: 1! = 1, 4! = 1 X 2 X 3 X 4 = 24.

Nhắc lại rằng ước số chung lớn nhất của hai số nguyên dương X và y, kí hiệu là ƯCLN(x,y), là số
nguyên dương q lớn nhất sao cho q là ước của cả X và y.

Bạn có thể giải quyết được nhiệm vụ của An không?

Dữ liệu: Vào từ tệp văn bản gcd.inp gồm một dòng chứa hai số nguyên ab (1 < a, b < 109;
min(a, tì) < 20, ở đó min(a, b) là số nhỏ nhất trong hai số a, b).

Kết quả: Ghi ra tệp văn bản gcd .out gồm một dòng chứa một số nguyên là ước số chung lớn nhất
của các số nguyên aỉ và b!.

Ví dụ:

gcd.inp

gcd.out

 

4 3

6

 

17 15

1307674368000

 

16 763121621

20922789888000

 

Trong ví dụ đầu tiên, 4! = 1x2x3x4 = 24 và 3! = 1x2x3 = 6, vì vậy ước chung lớn nhất của
các số nguyên 24 và 6 bằng 6.

Ràng buộc:

•       Có 60% số test ứng với 60% số điểm của bài thỏa mãn: 1 < a,b < 12;

•       20% số test khác ứng với 20% số điểm của bài thỏa mãn: 1 < a, b < 20;

•       20% số test còn lại ứng với 20% số điểm của bài không có ràng buộc gì thêm.

0 trả lời
Hỏi chi tiết
119
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Để giải quyết bài toán này, ta có thể sử dụng thuật toán Euclid để tìm ước số chung lớn nhất (ƯCLN) của hai số nguyên.

Thuật toán Euclid dựa trên việc lặp lại việc chia lấy dư cho đến khi dư bằng 0. Khi đó, số chia chính là ƯCLN của hai số ban đầu.

Với bài toán này, ta cần tính ƯCLN của a! và b!. Để tính giai thừa của một số nguyên, ta có thể sử dụng vòng lặp để nhân các số từ 1 đến số đó.

Dưới đây là mã giải bằng ngôn ngữ Python:

```python
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a

def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result

# Đọc dữ liệu từ file input
with open('gcd.inp', 'r') as f:
a, b = map(int, f.readline().split())

# Tính ƯCLN của a! và b!
result = gcd(factorial(a), factorial(b))

# Ghi kết quả vào file output
with open('gcd.out', 'w') as f:
f.write(str(result))
```

Độ phức tạp của thuật toán này là O(max(a, b)), với a và b là hai số nguyên đầu vào.

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
Bài tập Tin học Lớp 9 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

×
Trợ lý ảo Trợ lý ảo
×
Gia sư Lazi Gia sư