Có ai biết thuật toán đổi từ phân số ra số thập phân không? Lưu ý là số thập phân có 3 loại:
- Vô hạn tuần hoàn đơn, ví dụ 3,(9)
- Vô hạn tuần hoàn tạp, ví dụ 5,67(8)
- Hữu hạn
Thuật toán đổi phân số ra số thập phân
Bắt đầu bởi hieuchuoi@, 27-11-2006 - 12:36
#1
Đã gửi 27-11-2006 - 12:36
#2
Đã gửi 27-11-2006 - 16:44
#3
Đã gửi 28-11-2006 - 19:08
Ý anh nói là cái này phải không: http://casio.phpbb3.net/ftopic159.html
Nhưng đó là chuyển từ số thập phân ra phân số. (cái này em đc học từ hồi lớp 7 rùi )
Còn của em là phân số là số thập phân.
Nếu ở chỗ casio đó có thì anh cho em xin cái link nhá.
Nhưng đó là chuyển từ số thập phân ra phân số. (cái này em đc học từ hồi lớp 7 rùi )
Còn của em là phân số là số thập phân.
Nếu ở chỗ casio đó có thì anh cho em xin cái link nhá.
#4
Đã gửi 28-11-2006 - 23:40
Có đấy. Nhuưng hình như anh chưa post. Thuật toán này có trong cuốn Casio FX-4500P của anh chàng nào đó anh quên tên rồi. Nó chẳng qua là nghịch của đổi thập phân sang phân số. Ngồi bấm máy nhìn chóng mặt quá...
#5
Đã gửi 29-11-2006 - 00:02
Đây là bài tập Pascal của em em cũng làm kiểu nghịch lại của đổi tp->ps rồi như chạy mãi ko xong (dốt quá )
#6
Đã gửi 29-11-2006 - 09:39
Cái này là code của máy ClassPad tui hay dùng, thử xem
Thuật toán này ko hay lắm...
local k,n,s,tu,mau,temp Input n,"Nhap phan so",".:Nhap phan so:." s="" tu=numerator(n) mau=denominator(n)k=0 While k=0 GetKey k temp=int(tu/mau) tu=10(tu-mauîtemp) ExpToStr temp,temp StrJoin s,temp,s WhileEnd Print s
Thuật toán này ko hay lắm...
#7
Đã gửi 30-11-2006 - 12:12
Code này em sao hiểu nổi
#8
Đã gửi 30-11-2006 - 15:07
Thực ra là thế này:
B1:TU=nhập tử.
B2:MAU=nhập mẫu.
B3:gán k=0
B4.1:gán cho biến nguyên temp=int(TU/MAU)
B4.2:Gán cho biến string ST=phần nguyên của tử chia cho mẫu: ST=tostring(temp)
B5: TU=10*(TU-temp*MAU)
B6:nếu có phím ấn thì gán vào k, nếu ko k=0
B7:Thêm vào chuỗi ST giá trị temp: ST+=tostring(temp)
B8:Nếu temp==0 thì quay lại bước 5, nếu k<>0 thì đưa ra ST rồi kết thúc.
Ví dụ với tu=7,mau=6:
Thực ra thuật toán này là phép chia dọc căn bản
B1:TU=nhập tử.
B2:MAU=nhập mẫu.
B3:gán k=0
B4.1:gán cho biến nguyên temp=int(TU/MAU)
B4.2:Gán cho biến string ST=phần nguyên của tử chia cho mẫu: ST=tostring(temp)
B5: TU=10*(TU-temp*MAU)
B6:nếu có phím ấn thì gán vào k, nếu ko k=0
B7:Thêm vào chuỗi ST giá trị temp: ST+=tostring(temp)
B8:Nếu temp==0 thì quay lại bước 5, nếu k<>0 thì đưa ra ST rồi kết thúc.
Ví dụ với tu=7,mau=6:
TU 7 10 40 40 40 40 MAU 6 6 6 6 6 6 ST 1 1 6 6 6 6...
Thực ra thuật toán này là phép chia dọc căn bản
#9
Đã gửi 30-11-2006 - 15:09
lưu ý để cho ra phân số vô hạn tuần hoàn cần thêm 1 bước check sẽ làm chậm đáng kể chương trình.
#10
Đã gửi 30-11-2006 - 17:12
Bạn xem thử cái này xem (mình viết bằng VB).
Nó tính được:
92/97=0,(948453608247422680412371134020618556701030927835051546391752577319587628865979381443298969072164)
1001/1003=0,(99800598205383848454636091724825523429710867397806580259222333000997008973080757726819541375872382851445663010967098703888334995014955134596211365902293120638085742771684945164506480558325024925224327018943170488534396809571286141575274177467597208374875373878364905284147557328015952143569292123629112662013958125623130608175473579262213359920239282153539381854436689930209371884346959122632103688933200398803589232303090727816550348953140578265204386839481555333)
277531/24975=11,11(235)
Thử tính 12345/54321 thử xem... chu kỳ lớn lắm...
Nhưng nếu chu kỳ quá lớn các bạn sẽ phải chờ lâu đấy! (ví dụ 123456/654321 chẳng hạn, máy mình đứng luôn)
Nó tính được:
92/97=0,(948453608247422680412371134020618556701030927835051546391752577319587628865979381443298969072164)
1001/1003=0,(99800598205383848454636091724825523429710867397806580259222333000997008973080757726819541375872382851445663010967098703888334995014955134596211365902293120638085742771684945164506480558325024925224327018943170488534396809571286141575274177467597208374875373878364905284147557328015952143569292123629112662013958125623130608175473579262213359920239282153539381854436689930209371884346959122632103688933200398803589232303090727816550348953140578265204386839481555333)
277531/24975=11,11(235)
Thử tính 12345/54321 thử xem... chu kỳ lớn lắm...
Nhưng nếu chu kỳ quá lớn các bạn sẽ phải chờ lâu đấy! (ví dụ 123456/654321 chẳng hạn, máy mình đứng luôn)
File gửi kèm
Bài viết đã được chỉnh sửa nội dung bởi vanhoa: 30-11-2006 - 17:14
#11
Đã gửi 30-11-2006 - 19:50
Có thuật toán hay: Cũng dùng phép chia, lưu các số dư vào một mảng, dùng cách kiểm tra xem đến khi nào số dư ấy lặp lại là ok
#12
Đã gửi 30-11-2006 - 22:03
Thì mình cũng làm vậy đó
#13
Đã gửi 19-04-2007 - 13:57
bài này là bài tập pascal đây mà .bài này nếu chạy bằng pascal cũng ko lâu lắm còn việc có chu kì dài thì càng khỏi lo vì có mảng 1000 đến 10000 phần tử còn quá lớn thì dùng freepascal
#14
Đã gửi 03-07-2007 - 14:18
Đây là bài tập thuật toán nói chung chứ không phải là Pascal hay ngôn ngữ nào cả. Pascal là tên ngôn ngữ lập trình, còn Free Pascal là IDE (môi trường phát triển tích hợp) có tích hợp trình biên dịch FPC, Turbo Pascal cũng là IDE tích hợp trình biên dịch là TPC.bài này là bài tập pascal đây mà .bài này nếu chạy bằng pascal cũng ko lâu lắm còn việc có chu kì dài thì càng khỏi lo vì có mảng 1000 đến 10000 phần tử còn quá lớn thì dùng freepascal
Một ứng dụng rất hay của bài toán về số thuật phân vô hạn tuần hoàn: https://www.spoj.pl/problems/DEADFR/
Diễn đàn thảo luận giải thuật và lập trình: http://www.ioicamp.net/forums/
Các online judge hay: Sphere Online Judge - SPOJ Vietnam - TopCoder
Các online judge hay: Sphere Online Judge - SPOJ Vietnam - TopCoder
0 người đang xem chủ đề
0 thành viên, 0 khách, 0 thành viên ẩn danh