Khi bạn chuyển đổi một phân số thành một số thập phân và bạn muốn lưu trữ số đó, bạn thường phải làm tròn nó, bởi vì bạn chỉ muốn sử dụng một lượng bộ nhớ nhất định. Giả sử bạn chỉ có thể lưu trữ 5 chữ số thập phân, sau đó 5/3 trở thành 1.6667. Nếu bạn chỉ có thể lưu trữ 2 chữ số thập phân thì nó sẽ là 1.7 (bây giờ giả sử rằng nó luôn nằm trong khoảng từ 0 đến 9,99 ...).
Nếu bây giờ bạn cố gắng đảo ngược quá trình đó với 1.7 và bạn muốn lấy lại phân số của mình, điều đó có thể khó khăn, vì bạn biết rằng 1.7 chỉ là một số làm tròn. Tất nhiên bạn có thể thử 17/10 nhưng đó là một phần 'xấu xí' so với 5/3 'thanh lịch'.
Vì vậy, mục tiêu hiện đang tìm phân số a / b có mẫu số nhỏ nhất b, dẫn đến số thập phân được làm tròn khi được làm tròn chính xác.
Chi tiết
Đầu vào chứa một chuỗi có số lượng từ 1 đến 5 chữ số nằm trong khoảng từ 0 (bao gồm) đến 10 (không bao gồm) với dấu '.' sau chữ số đầu tiên. Hãy nói rằng n
biểu thị số chữ số. Đầu ra phải là một danh sách / mảng gồm hai số nguyên [numerator, denominator]
hoặc kiểu dữ liệu hợp lý (bạn có thể tự tạo hoặc sử dụng tích hợp) trong đó tử số không âm và mẫu số là dương. Tử số / mẫu số phân số phải bằng với đầu vào khi được làm tròn chính xác thành n
chữ số (có nghĩa là các n-1
chữ số sau dấu thập phân).
Hạn chế: chỉ cho phép một câu lệnh lặp. Điều này có nghĩa là bạn chỉ có thể sử dụng một câu lệnh lặp đơn (như for
hoặc while
hoặc goto
v.v. cũng như các vòng lặp chức năng như map
hoặc fold
áp dụng mã cho mọi phần tử của danh sách / mảng) trong toàn bộ mã của bạn, nhưng bạn có thể 'lạm dụng' nó hoặc sử dụng đệ quy vv
Bạn nên viết một hàm. Nếu ngôn ngữ của bạn không có chức năng (hoặc thậm chí nếu có), bạn có thể thay thế giả định rằng đầu vào được lưu trữ trong một biến (hoặc đầu vào qua stdin) và in kết quả hoặc ghi vào tệp. Số byte thấp nhất sẽ thắng.
Làm tròn
Việc làm tròn phải tuân theo quy tắc làm tròn 'thông thường', tức là nếu chữ số cuối cùng bị cắt là 5 hoặc lớn hơn, bạn sẽ làm tròn và bạn sẽ làm tròn cho bất kỳ trường hợp nào khác, ví dụ:
4.5494 sẽ có kết quả khi làm tròn đến
- 1 chữ số: 5
- 2 chữ số: 4,5
- 3 chữ số: 4,55
- 4 chữ số: 4.549
Ví dụ
Vui lòng bao gồm các trường hợp thử nghiệm sau đây và các trường hợp 'thú vị' khác:
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
tương đương với map(f, map(g, numbers))
. Phiên bản chức năng sử dụng map
hai lần, điều đó có thực sự không được phép?
repeat
tạo ra một danh sách vô hạn đối số của nó. Tôi dường như lặp lại nhưng nó thực sự có độ phức tạp thời gian của O (1). Nhưng tôi đoán sắp xếp từng trường hợp riêng lẻ tốt hơn là không cho phép các ngôn ngữ chức năng.