Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Biểu diễn phân số dưới dạng số thập phân

  1. #1
    Ngày gia nhập
    09 2011
    Nơi ở
    KCN Tiên Sơn , Bắc Ninh
    Bài viết
    1

    Mặc định Biểu diễn phân số dưới dạng số thập phân

    Em hỏi thuật toán của mấy bài này ạ :

    1. Cho 2 số nguyên P và Q. Lập trình viết ra biểu diễn thập phân của P/Q (0 < P,Q <= 10^9)
    2. Lập trình tìm chữ số thập phân thứ k trong biểu diễn thập phân của P/Q (0 < P,Q <= 10^9)
    3. Lập trình tính A+B biết 0 < A,B < 10^10000)
    Học dốt C++ nhưng thích học C++

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi yeutin Xem bài viết
    Em hỏi thuật toán của mấy bài này ạ :

    1. Cho 2 số nguyên P và Q. Lập trình viết ra biểu diễn thập phân của P/Q (0 < P,Q <= 10^9)
    2. Lập trình tìm chữ số thập phân thứ k trong biểu diễn thập phân của P/Q (0 < P,Q <= 10^9)
    3. Lập trình tính A+B biết 0 < A,B < 10^10000)
    Bạn có thể cho ví dụ đầu vào/ đầu ra cho mỗi bài toán được ko?

    Dưới đây là bài lấy ra chữ số thập phân thứ k, mình cho đầu vào là một số cụ thể luôn, chủ yếu để minh họa.
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    #include <math.h>
    
    main()
    {
       float f=12.345678;
    
       int x, kq;
       cout<<"Ban muon lay ra chu so thap phan thu may " ;
       cin>>x;
    
       float phanle;
       phanle = f - (int)f;
    
       kq = (int)(phanle*pow(10,x)) % 10;
    
       cout<<"\nSo ban dau : "<<f;
       cout<<"\nket qua la : "<<kq;
    
       getch();
       return 0;
    
    }

  3. #3
    Ngày gia nhập
    09 2011
    Nơi ở
    KCN Tiên Sơn , Bắc Ninh
    Bài viết
    1

    ví dụ : (các ví dụ này có P , Q , k nguyên dương)
    1, vào : P = 5
    Q = 2
    ra : 2.5 (thập phân hữu hạn)
    vào : P = 10
    Q=3
    ra : 3.(3) (số thập phân vô hạn tuần hoàn)
    chú ý là số có dạng P/Q thì biểu diễn số thập phân chỉ có thể là hữu hạn hoặc vô hạn tuần hoàn
    2. vào : P=1
    Q=8
    (P/Q = 0.125)
    k=3
    ra : 5
    vào : P = 1
    Q = 7
    (P/Q = 0.(142857))
    k = 100
    ra : 8
    chú ý là nếu P/Q là số thập phân hữu hạn thì phải nhập k ko lớn hơn số chữ số thập phân sau dấu phảy còn P/Q là số thập phân vô hạn tuần hoàn thì k bằng bao nhiêu cũng được
    3. vào : A = 1000000000000000
    B = 2000000000000000
    ra : 3000000000000000
    chú ý là 0 < A,B < 10^10000 nên dễ bị tràn dữ liệu nếu dùng kiểu int , long int , long long , double ,...
    đấy là 1 số ví dụ của mình
    Học dốt C++ nhưng thích học C++

  4. #4
    Ngày gia nhập
    09 2011
    Nơi ở
    KCN Tiên Sơn , Bắc Ninh
    Bài viết
    1

    Sao ko ai trả lời giúp mình nữa vậy
    mình chả biết cách giải dù nó có vẻ dễ
    mình có bài này nữa vừa đọc được :
    ta quy ước 3 cm = 1 inch và 12 inchs = 1 foot.lập trình nhập vào số foot rồi phân tích ra số inch và số cm.có thể làm tròn 2 cm = 1 inch
    dữ liệu inp.txt
    dòng 1 ghi số foot
    kết quả : out.txt
    dòng 1 : lần lượt ghi số inch và số cm
    VD : nhập : 42
    xuất : 3 2
    nhập : 5
    xuất : 0 2
    Học dốt C++ nhưng thích học C++

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi yeutin Xem bài viết
    Em hỏi thuật toán của mấy bài này ạ :

    1. Cho 2 số nguyên P và Q. Lập trình viết ra biểu diễn thập phân của P/Q (0 < P,Q <= 10^9)
    C++ Code:
    1. #include <iostream.h>
    2. void decimalization(long p, long q)
    3. {
    4.     cout << p <<'/' << q << " = ";
    5.     long a[1000]; int b[1000], sign = 0;
    6.     if (q < 0) {p = -p; q = - q;}
    7.     if (p < 0) {p = -p; sign = 1;}
    8.     b[0] = p/q; p = p%q; a[0] = p;
    9.     int k = 1, j;
    10.     do
    11.     {
    12.         p = p*10; b[k] = p/q; p = p%q;
    13.         j = 0;
    14.         while (j < k && p != a[j]) j++;
    15.         if (j == k) a[k] = p;
    16.         k++;
    17.     } while (p && j == k-1);
    18.  
    19.     if (sign) cout << '-';
    20.     cout << b[0] <<'.';
    21.     for (int i = 1; i <= j; i++) cout << b[i];
    22.     if (j < k - 1)
    23.     {
    24.         cout <<'(';
    25.         for (; i < k; i++) cout << b[i];
    26.         cout <<')' << endl;
    27.     }
    28. }
    29.  
    30. void main()
    31. {
    32.     decimalization(1,7);
    33.     decimalization(10,70);
    34.     decimalization(1234,113);
    35.     decimalization(-1,710);
    36. }
    PHP Code:
    1/0.(142857)
    10/70 0.(142857)
    1234/113 10.(9203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168141592)
    -
    1/710 = -0.0(01408450704225352112676056338028169

  6. #6
    Ngày gia nhập
    09 2011
    Nơi ở
    KCN Tiên Sơn , Bắc Ninh
    Bài viết
    1

    Mặc định Biểu diễn phân số dưới dạng số thập phân

    mình hỏi thuật toán bạn ạ. bạn giải thích hộ mình đi. mình chưa hiểu lắm khi đọc code
    thanks
    Học dốt C++ nhưng thích học C++

  7. #7
    Ngày gia nhập
    10 2011
    Bài viết
    0

    Đây code bài chữ số thứ k của phân số p/q (0<p,q<=maxlongint) của mình:
    #include<cstdio>
    #include<cstdlib>
    const long ga=50000;
    typedef short m1[ga+1];
    m1 a,d;
    long uc(long a,long b)
    {long r;
    while (b)
    {r=a%b;a=b;b=r;}
    return a;}
    main()
    {long t,m,r,i,a0,d0,k;
    int l1=0,l2=0;
    bool vhth=true;
    scanf("%ld%ld%ld",&t,&m,&k);
    r=uc(t,m);t/=r;m/=r;
    a0=t/m;
    t%=m;
    if (!t) vhth=false;
    else
    if (t>0)
    do
    {l2++;d[t]=l2;
    t*=10;a[l2]=t/m;
    t%=m;
    if (!t)
    {vhth=false;break;}
    if (d[t]>0) l1=d[t];
    }
    while (d[t]<=0);
    if (l2)
    {if (!vhth)
    if (k<=l2) printf("%d",a[k]);
    if (vhth)
    if (k<=l1-1) printf("%d",a[k]);
    else
    if (l2!=l1) printf("%d",a[(k-l1)%(l2-l1)+l1]);
    else printf("%d",a[k%l1+l1]);}
    return 0;
    }

    Lời giải của nó bằng pas có trong cuốn em tập lập trình tập 1.
    @yeutin:Nếu cậu muốn nâng cao trình độ của mình thì nên làm 1 số online judge hoặc contest chứ không nên hỏi mấy bài thầy giáo cho thế này.

  8. #8
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Đây cho mình hỏi ngu tí :
    Bỏ đoạn if (j == k) và j == k-1 có đặng không??
    Trích dẫn Nguyên bản được gửi bởi wuanwu Xem bài viết
    C++ Code:
    1. #include <iostream.h>
    2. void decimalization(long p, long q)
    3. {
    4.     cout << p <<'/' << q << " = ";
    5.     long a[1000]; int b[1000], sign = 0;
    6.     if (q < 0) {p = -p; q = - q;}
    7.     if (p < 0) {p = -p; sign = 1;}
    8.     b[0] = p/q; p = p%q; a[0] = p;
    9.     int k = 1, j;
    10.     do
    11.     {
    12.         p = p*10; b[k] = p/q; p = p%q;
    13.         j = 0;
    14.         while (j < k && p != a[j]) j++;
    15. // Bỏ thế này có đươc ko bạn ??
    16.         /*if (j == k)*/ a[k] = p;
    17.         k++;
    18.     } while (p /*&& j == k-1*/);
    19.  
    20.     if (sign) cout << '-';
    21.     cout << b[0] <<'.';
    22.     for (int i = 1; i <= j; i++) cout << b[i];
    23.     if (j < k - 1)
    24.     {
    25.         cout <<'(';
    26.         for (; i < k; i++) cout << b[i];
    27.         cout <<')' << endl;
    28.     }
    29. }
    30.  
    31. void main()
    32. {
    33.     decimalization(1,7);
    34.     decimalization(10,70);
    35.     decimalization(1234,113);
    36.     decimalization(-1,710);
    37. }
    PHP Code:
    1/0.(142857)
    10/70 0.(142857)
    1234/113 10.(9203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168141592)
    -
    1/710 = -0.0(01408450704225352112676056338028169

  9. #9
    Ngày gia nhập
    10 2011
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi clchicken Xem bài viết
    Đây cho mình hỏi ngu tí :
    Bỏ đoạn if (j == k) và j == k-1 có đặng không??
    Không thể bỏ được.
    C++ Code:
    1.     do
    2.     {
    3.         p = p*10; b[k] = p/q; p = p%q; // p là phần dư mới
    4.         j = 0;
    5.         while (j < k && p != a[j]) j++; // Kiểm tra xem p đã có trong mảng a (lưu các phần dư) chưa
    6.         if (j == k) a[k] = p; // Nếu p chưa có trong mảng a thì nạp p vào cuối mảng a
    7.         k++;
    8.     } while (p && j == k-1); // Lặp khi số dư p khác 0 và p vừa được nạp vào (j==k-1), dừng khi p đã có rồi và không được nạp nữa (j < k-1)

  10. #10
    Ngày gia nhập
    10 2011
    Bài viết
    0

    Bài thứ 2 của yeutin là một bài tập trên codeforces:
    http://codeforces.com/problemset/problem/125/A
    Lời giải:
    C++ Code:
    1. using namespace std;
    2. #include<cstring>
    3. #include<cstdio>
    4. #include<cstdlib>
    5. #include<cmath>
    6. int main()
    7. {
    8.     long n;
    9.     scanf("%ld",&n);
    10.     if (n%36==35)
    11.         printf("%ld 0",n/36+1);
    12.     else
    13.     {
    14.         printf("%ld ",n/36);
    15.         long d=(n%=36)/3;
    16.         if (n%3==2) printf("%ld",d+1);
    17.         else printf("%ld",d);
    18.     }
    19.     return 0;
    20. }

Quyền hạn của bạn

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