Follow us on...
Follow us on Twitter Follow us on Facebook Watch us on YouTube

Reviews hay rinh note 4, galaxy V được vi vu Hàn Quốc

Gameshow “Ai Là Triệu Phú” trên VTV đang chờ đón bạn – Tải ngay!

Lời mời tham dự chương trình từ thiện "Giáng Sinh Trong Mắt Em"

Mời anh em tham gia Vn-zoom support team

Chiêm ngưỡng BaoMoi đẹp "tuyệt diệu" trên Windows Phone

Vn-Zoom.com tặng các bạn thành viên may mắn một chiếc Note 4
Trang 1/3 1 2 3 cuốicuối
kết quả từ 1 tới 15 trên 36
  1. #1
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default [HỎI] Cách chuyển 1 số thập phân thành phân số???

    Mình đang làm 1 bài tập và kết quả nó toàn là kiểu số thập phân, in ra kiểu đó thì trông vừa xấu lại kết quả nó chỉ là gần đúng nên mình muốn chuyển chúng thành dạng phân số cho nó đẹp.
    Đã search qua 1 vài cách trên mạng nhưng thấy không ổn cho lắm nên lên hỏi mọi người
    Ai có tư tưởng thuật toán thì chia sẻ với, có demo code thì càng tốt
    C/C++ hay pascal cũng được hết nhưng C thì tốt hơn vì mình đang viết bằng C

  2. Có 1 thành viên cảm ơn Tung_Huynh cho bài viết này:
    kien_coi_1997 (15-04-2011)

  3. #2
    19-6's Avatar
    19-6 vẫn chưa có mặt trong diễn đàn Moderator
    Tham gia
    Sep 2008
    Đến từ
    Abyss
    Bài
    1.904
    Cảm ơn
    858
    Điểm
    3.438/1.515 bài viết

    Default

    nếu là số thập phân vô hạn thì mình bó tay, còn hữu hạn thì dễ rồi, ví dụ như 3.14 thì bạn lấy 314/100 rồi tối giản đi là xong


  4. Có 2 thành viên cảm ơn 19-6 cho bài viết này:
    kien_coi_1997 (15-04-2011), Tung_Huynh (12-04-2011)

  5. #3
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default

    như thế hơi khó vì kết quả của mình bản chất nó vẫn là từ các phép + - * / phân số thôi, nhưng sau tính toán nó ra thành số thập phân, giờ muốn chuyển lại thành phân số..

    Tại ban đầu mình code cho số thập phân, giờ cô giáo bảo mở rộng ra cho dữ liệu phân số hik
    Giờ thay các hàm tính phân số vào chắc chết mất nên phải chơi kiểu này

  6. Có 1 thành viên cảm ơn Tung_Huynh cho bài viết này:
    kien_coi_1997 (15-04-2011)

  7. #4
    Ku Thang's Avatar
    Ku Thang vẫn chưa có mặt trong diễn đàn Búa Đá Đôi
    Tham gia
    Feb 2008
    Bài
    76
    Cảm ơn
    48
    Điểm
    10/9 bài viết

    Default

    Nếu thế bạn có thể lưu 2 số (tử và mẫu) ngay khi thực hiện các phép chia. ^^

  8. Có 2 thành viên cảm ơn Ku Thang cho bài viết này:
    kien_coi_1997 (15-04-2011), Tung_Huynh (12-04-2011)

  9. #5
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default

    Trích Ku Thang View Post
    Nếu thế bạn có thể lưu 2 số (tử và mẫu) ngay khi thực hiện các phép chia. ^^
    tại cái bài cũ của mình mấy trăm dòng code toàn thực hiện với ma trận float rồi. Nếu bây giờ chuyển toàn bộ các phép tính trong đó thành dạng tính cho ma trận thì hơi lâu thôi
    Giả sử đã viết xong mấy hàm cong() tru nhan() chia() phân số giờ lại phải thay hết
    a*b thành nhan(a,b) .......... lâu quá
    nên mình mới thử làm cách: nhập vào phân số -> chuyển thành thập phân -> tính toán như cũ -> chuyển kết quả về phân số
    Thì bài cũ của mình đỡ rủi ro sai sót hơn

  10. Có 1 thành viên cảm ơn Tung_Huynh cho bài viết này:
    kien_coi_1997 (15-04-2011)

  11. #6
    kien_coi_1997's Avatar
    kien_coi_1997 vẫn chưa có mặt trong diễn đàn Rìu Vàng Đôi
    Tham gia
    Apr 2009
    Đến từ
    Hà nội
    Bài
    1.116
    Cảm ơn
    693
    Điểm
    1.255/559 bài viết

    Default

    mình làm dc rồi nhưng bận, hôm nào rỗi mình up lên
    chỉ những số có đuôi lặp lại <9 thì mới chuyển thành thập phân dc, còn >9 thì nó cho số 0 !
    vd : 0.333333 = 1/3 đuôi lặp lại là '3' có độ dài <9
    bận quá, nói chung, chỉ cần biết đuoi lặp lại là tíh dc
    0.123123123... = 0.001001001*123 = 1/999 * 123
    đó, ví dụ đó,
    1/9 = 0.1111
    1/99=0.01010101
    ...

    ---------- Bài thêm lúc 18:13 ---------- Bài trước là lúc 18:12 ----------

    mình làm dc rồi nhưng bận, hôm nào rỗi mình up lên
    chỉ những số có đuôi lặp lại <9 thì mới chuyển thành thập phân dc, còn >9 thì nó cho số 0 !
    vd : 0.333333 = 1/3 đuôi lặp lại là '3' có độ dài <9
    bận quá, nói chung, chỉ cần biết đuoi lặp lại là tíh dc
    0.123123123... = 0.001001001*123 = 1/999 * 123
    đó, ví dụ đó,
    1/9 = 0.1111
    1/99=0.01010101
    ...
    Blog về Pascal_chương trình pascal_ game pascal...
    Pascal-Chương trình hay, Unit hay, Game Pascal, các phần hỗ trợ trong Pascal.
    My blog: http://vn.360plus.yahoo.com/kien_coi_1997

  12. Có 1 thành viên cảm ơn kien_coi_1997 cho bài viết này:
    Tung_Huynh (12-04-2011)

  13. #7
    tung3tvn's Avatar
    tung3tvn vẫn chưa có mặt trong diễn đàn Rìu Sắt
    Tham gia
    Aug 2009
    Bài
    139
    Cảm ơn
    7
    Điểm
    64/37 bài viết

    Default

    Bài này sau khi ra được số thập phân thì như bác đã nói, kết quả từ các phép + - * / phân số nên chắc chắn kết quả sẽ là số thập phân hữu hạn hoặc vô hạn tuần hoàn
    *Hữu hạn thì bác cứ nhân dần với 10 cho đến khi phần thập phân =0, sau đó lấy số ấy chia cho 10^số lần nhân
    VD: 3,14 => 31,4 => 314, số lần nhân là 2 => phân số là 314/100, sau đó tối giản
    *Nếu là vô hạn tuần hoàn thì bác tìm quy luật của nó, sau đó thì làm như sau
    VD số 0,(13147)=0,00001*13147=1/100000*13147, sau đó tối giản

  14. Có 2 thành viên cảm ơn tung3tvn cho bài viết này:
    kien_coi_1997 (15-04-2011), Tung_Huynh (12-04-2011)

  15. #8
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default

    Trích kien_coi_1997 View Post
    mình làm dc rồi nhưng bận, hôm nào rỗi mình up lên
    chỉ những số có đuôi lặp lại <9 thì mới chuyển thành thập phân dc, còn >9 thì nó cho số 0 !
    vd : 0.333333 = 1/3 đuôi lặp lại là '3' có độ dài <9
    bận quá, nói chung, chỉ cần biết đuoi lặp lại là tíh dc
    0.123123123... = 0.001001001*123 = 1/999 * 123
    đó, ví dụ đó,
    1/9 = 0.1111
    1/99=0.01010101
    ...

    ---------- Bài thêm lúc 18:13 ---------- Bài trước là lúc 18:12 ----------

    mình làm dc rồi nhưng bận, hôm nào rỗi mình up lên
    chỉ những số có đuôi lặp lại <9 thì mới chuyển thành thập phân dc, còn >9 thì nó cho số 0 !
    vd : 0.333333 = 1/3 đuôi lặp lại là '3' có độ dài <9
    bận quá, nói chung, chỉ cần biết đuoi lặp lại là tíh dc
    0.123123123... = 0.001001001*123 = 1/999 * 123
    đó, ví dụ đó,
    1/9 = 0.1111
    1/99=0.01010101
    ...
    đã xét kiểu số thập phân vô hạn nhưng bán tuần hoàn chưa
    vì tuần hoàn nó cũng có lắm kiểu tuần hoàn
    Như mấy ví dụ của bạn thì là kiểu tuần hoàn hoàn toàn
    0.(3)
    0.(123)
    ....
    nó còn có kiểu
    0.123(45)
    hoặc là số vô hạn không tuần hoàn thì cũng chính là tuần hoàn với chu kỳ "vô cùng"

  16. Có 1 thành viên cảm ơn Tung_Huynh cho bài viết này:
    kien_coi_1997 (15-04-2011)

  17. #9
    gamacuthinh11's Avatar
    gamacuthinh11 vẫn chưa có mặt trong diễn đàn Rìu Sắt
    Tham gia
    Dec 2009
    Bài
    174
    Cảm ơn
    221
    Điểm
    48/36 bài viết

    Default

    theo mình nghĩ cách chuyển từ thập phân sang phân số thế này, bạn thử coi có được không há:
    vì là máy tính nên cho dù có là số thập phân tuần hoàn hay vô tỉ đi nữa thì trong máy tính chỉ có thể lưu được một vài con số đuôi thôi,
    VD như số pi là 3,14159265358... thì máy cũng có thể lưu 3,14 hoặc hơn 3,14159
    bạn hãy thử để ý coi là nó lưu tối đa mấy số (trong BC lưu tối đa 6 sô) rồi thử theo cách này
    VD máy tinh lưu 3 số là 3,142 vậy hãy tìm USCLN x của 3,142*1000 và 1000
    rồi lấy 2 biến tử lưu số 3,142*1000/x và biến mẫu lưu 1000/x
    thế là bạn có 1 phân số rồi đó
    Thay đổi nội dung bởi gamacuthinh11; 12-04-2011 lúc 21:56.
    I can can a can

  18. Có 2 thành viên cảm ơn gamacuthinh11 cho bài viết này:
    kien_coi_1997 (15-04-2011), Tung_Huynh (12-04-2011)

  19. #10
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default

    Trích gamacuthinh11 View Post
    theo mình nghĩ cách chuyển từ thập phân sang phân số thế này, bạn thử coi có được không há:
    vì là máy tính nên cho dù có là số thập phân tuần hoàn hay vô tỉ đi nữa thì trong máy tính chỉ có thể lưu được một vài con số đuôi thôi,
    VD như số pi là 3,14159265358... thì máy cũng có thể lưu 3,14 hoặc hơn 3,14159
    bạn hãy thử để ý coi là nó lưu tối đa mấy số (trong BC lưu tối đa 6 sô) rồi thử theo cách này
    VD máy tinh lưu 3 số là 3,142 vậy hãy tìm USCLN x của 3,142*1000 và 1000
    rồi lấy 2 biến tử lưu số 3,142*1000/x và biến mẫu lưu 1000/x
    thế là bạn có 1 phân số rồi đó
    cách của bạn tuơng tự như cách của tung3tvn
    nghĩa là nhân với 10^x nào đó cho hết phần thập phân
    rồi tối giản phân số vừa tìm được kia...
    nếu không tìm được tuần hoàn của nó hoặc tuần hoàn quá lớn thì cái tử và mẫu có thể sẽ không phải là số nhỏ gọn gàng

  20. Có 1 thành viên cảm ơn Tung_Huynh cho bài viết này:
    kien_coi_1997 (15-04-2011)

  21. #11
    gamacuthinh11's Avatar
    gamacuthinh11 vẫn chưa có mặt trong diễn đàn Rìu Sắt
    Tham gia
    Dec 2009
    Bài
    174
    Cảm ơn
    221
    Điểm
    48/36 bài viết

    Default

    Trích Tung_Huynh View Post
    nên mình mới thử làm cách: nhập vào phân số -> chuyển thành thập phân -> tính toán như cũ -> chuyển kết quả về phân số
    nếu bài của bạn là tính toán phân số thì bạn có thể dùng "operator" trong "class" để định nghĩa các phép toán tử + - * / rồi sử dụng bình thường như một số bình thường vậy
    code vd cho phép cộng:
    Code:
    class phanso
    {
    	int tu,mau;
      public:
    	friend phanso operator +(phanso a);
    };
    
    phanso phanso::operator+(phanso a)
    {
    	phanso b;
    	b.tu=tu*a.mau+a.tu*mau;
    	b.mau=mau*a.mau;
    	return rutgon(b);
    }
    khi tính toán chỉ cần gọi c=a+b là xong

    còn về chuyển từ thập phân sang phân số thì để mai tui hỏi ông thầy thử coi ra sao
    nếu có đáp án khác sẽ thông báo sao
    I can can a can

  22. Có 2 thành viên cảm ơn gamacuthinh11 cho bài viết này:
    kien_coi_1997 (15-04-2011), Tung_Huynh (13-04-2011)

  23. #12
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default

    Chưa nạp chồng trong C++ bao giờ tại không đuợc học C++...
    Để lần này thử phát xem sao s

  24. Có 1 thành viên cảm ơn Tung_Huynh cho bài viết này:
    kien_coi_1997 (15-04-2011)

  25. #13
    gamacuthinh11's Avatar
    gamacuthinh11 vẫn chưa có mặt trong diễn đàn Rìu Sắt
    Tham gia
    Dec 2009
    Bài
    174
    Cảm ơn
    221
    Điểm
    48/36 bài viết

    Default

    Trích gamacuthinh11 View Post
    còn về chuyển từ thập phân sang phân số thì để mai tui hỏi ông thầy thử coi ra sao
    nếu có đáp án khác sẽ thông báo sao
    ông thây cũng bó tay rồi, ổng không bit lun
    chỉ còn cách là nhân theo 10^x để chuyển thủ công sang phân số thôi
    còn nếu ai có thể chuyển thì cho mình xin chỉ giáo với nha
    I can can a can

  26. Có 1 thành viên cảm ơn gamacuthinh11 cho bài viết này:
    kien_coi_1997 (15-04-2011)

  27. #14
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.136/2.750 bài viết

    Default

    code đây, ba` con test hộ phát
    Cơ chế vẫn là tách phần thập phân, nghịch đảo phần thập phân
    rồi lại tách phần thập phân của số đó rồi lại nghịch đảo

    Dữ liệu trả đúng với các phân số có tử, mẫu <256

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <conio.h>
    
    typedef struct phanso
    	{
    		int tu,mau;
    	};
    
    phanso DoubletoFrac(double input)
    {   phanso kq;
    
    	int p0 = 1;
    	int q0 = 0;
    	int p1 = (int) floor(input);
    	int q1 = 1;
    	int p2;
    	int q2;
    
    	double r = input - p1;
    	double next_cf;
    	while(1)
    	{
    		r = 1.0 / r;
    		next_cf = floor(r);
    		p2 = (int) (next_cf * p1 + p0);
    		q2 = (int) (next_cf * q1 + q0);
    
    		// Limit the numerator and denominator to be 256 or less
    		if(p2 > 256 || q2 > 256)
    				break;
    
    		// remember the last two fractions
    		p0 = p1;
    		p1 = p2;
    		q0 = q1;
    		q1 = q2;
    
    		r -= next_cf;
    	}
    
    	input = (double) p1 / q1;
    	// hard upper and lower bounds for ratio
    	if(input > 256.0)
    	{
    		p1 = 256;
    		q1 = 1;
    	}
    	else if(input < 1.0 / 256.0)
    	{
    		p1 = 1;
    		q1 = 256;
    	}
    	kq.tu=p1; kq.mau=q1;
    	return kq;
    }
    
    main()
    {
     double a=0.5294;
     printf("\n%d / %d",DoubletoFrac(a).tu,DoubletoFrac(a).mau);
     getch();
     getch();
    }

  28. Có 2 thành viên cảm ơn Tung_Huynh cho bài viết này:
    gamacuthinh11 (14-04-2011), kien_coi_1997 (15-04-2011)

  29. #15
    kien_coi_1997's Avatar
    kien_coi_1997 vẫn chưa có mặt trong diễn đàn Rìu Vàng Đôi
    Tham gia
    Apr 2009
    Đến từ
    Hà nội
    Bài
    1.116
    Cảm ơn
    693
    Điểm
    1.255/559 bài viết

    Default

    Code:
    const saiso=0.0000000000001;
    var A:real; X,Y:integer;
    Begin
    writeln('A='); readln(A);
    //A:=5/6-2/7;
    
    X:=0; Y:=1;
    
    while X/Y +saiso < A do
    Begin
      if (X+1)/Y<=A+saiso then X:=X+1
      else if X/(Y+1)<=A+saiso then Y:=Y+1;
    End;
    
    writeln(X:5,Y:5);
    readln;
    End.
    Thử code này xem.

    ---------- Bài thêm lúc 15:50 ---------- Bài trước là lúc 15:47 ----------

    const saiso=0.0000000001;
    var A:real; X,Y,Z:integer;
    Begin
    writeln('A='); readln(A);
    Z:=trunc(A); A:=frac(A);
    //A:=5/6-2/7;

    X:=0; Y:=1;

    while X/Y +saiso < A do
    Begin
    if (X+1)/Y<=A+saiso then X:=X+1
    else if X/(Y+1)<=A+saiso then Y:=Y+1;
    End;

    writeln(Z:5,X:5,Y:5);
    readln;
    End.


    Code này mạnh mẽ hơn nhiều, kết quả là hỗn số

    ---------- Bài thêm lúc 15:52 ---------- Bài trước là lúc 15:50 ----------

    Thay kiểu integer thành Int64 thì không bao giờ còn bị E201 nữa

    ---------- Bài thêm lúc 15:51 ---------- Bài trước là lúc 15:52 ----------

    A=
    147852.1234561234561234561234561234561234561234561 23456
    147852 9146 74083
    Blog về Pascal_chương trình pascal_ game pascal...
    Pascal-Chương trình hay, Unit hay, Game Pascal, các phần hỗ trợ trong Pascal.
    My blog: http://vn.360plus.yahoo.com/kien_coi_1997

  30. Có 2 thành viên cảm ơn kien_coi_1997 cho bài viết này:
    trieuhuy2304 (06-07-2013), Tung_Huynh (14-04-2011)

 

 
Trang 1/3 1 2 3 cuốicuối

Tag của Đề tài này

Quyền sử dụng

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể tự sửa bài viết của mình
  •