Một giải pháp xử lý vấn đề này là sử dụng thư viện "fractions" có sẵn của Python để tính toán các số hữu tỷ (phân số - rational number). Tập số hữu tỷ được ký hiệu là tập Q khi học ở phổ thông:
các tập số |
- Tử số và mẫu số
- String biểu diễn phân số
- Một số integer hay float
Các đoạn code sử dụng Python 3 với IPython.
Ta import thư viện trước:
In [3]: from fractions import Fraction as FĐầu vào là tử số và mẫu số:
In [4]: F(16, 10)Thấy Python tự tối giản phân số.
Out[4]: F(8, 5)
String biểu diễn phân số
In [7]: F('10/2')Nhận vào số nguyên (integer)
Out[7]: Fraction(5, 1)
In [6]: F(123)Nhận vào số thực (kiểu float)
Out[6]: Fraction(123, 1)
In [17]: F(0.1)Ta thấy ở đây, Fraction đã biểu diễn chính xác giá trị "ẩn dưới" kiểu float. Bởi kiểu float không biểu diễn chính xác được giá trị 0.1 mà chỉ xấp xỉ nó bằng một phân số. Do vậy tổng của 3 phân số float 0.1 sẽ không bằng 0.3:
Out[17]: Fraction(3602879701896397, 36028797018963968)
In [18]: F(0.1) + F(0.1) + F(0.1)
Out[18]: Fraction(10808639105689191, 36028797018963968)
In [37]: F(0.3)Để biểu diễn giá trị 0.1, ta dùng phân số 1/10:
Out[37]: Fraction(5404319552844595, 18014398509481984)
In [21]: F(1,10) + F(1,10) + F(1,10)
Out[21]: Fraction(3, 10)
In [23]: F('1/10') +F('1/10') + F('1/10')Để thu được dạng float của phân số biểu diễn bởi kiểu Fraction, ta dùng function float:
Out[23]: Fraction(3, 10)
In [31]: F(1,8)Bài tập:
Out[31]: Fraction(1, 8)
In [32]: float(F(1,8))
Out[32]: 0.125
Tìm tập các bộ số nguyên a,b,c thoả mãn a + b/c = 10 với a,b,c thuộc tập [1,10)
Bài giải:
In [35]: for a in range(1, 10):
...: for b in range(1, 10):
...: for c in range(1, 10):
...: if F(a) + F(b,c) == 10:
...: print(a,b,c, sep=',', end=' ')
...:
...:
1,9,1 2,8,1 3,7,1 4,6,1 5,5,1 6,4,1 6,8,2 7,3,1 7,6,2 7,9,3 8,2,1 8,4,2 8,6,3 8,8,4 9,1,1 9,2,2 9,3,3 9,4,4 9,5,5 9,6,6 9,7,7 9,8,8 9,9,9
Hết.
Bạn có thắc mắc về Python không biết hỏi ai? vào ngay http://invite.pymi.vn/
Bạn muốn học Python? đăng ký tại: https://pymi.vn/
HVN at http://www.familug.org/ and http://pymi.vn
làm sao lấy mẫu với lấy tử ra vậy bạn
ReplyDeleteAdmiring the time and effort you put into your website and in depth information you present. It’s good to come across a blog every once in a while that isn’t the same old rehashed information. Wonderful read! I’ve bookmarked your site and I’m adding your RSS feeds to my Google account. https://python.engineering/python-sympy-xreplace-method/
ReplyDelete