Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 16
  1. #1
    Tham gia
    05-03-2009
    Bài viết
    23
    Like
    0
    Thanked 0 Times in 0 Posts

    Ngạc nhiên Tối giản một phân số trong C

    . Trong một chương trình, viết các hàm tìm ước số chung lớn nhất và bội số chung nhỏ nhất của hai số a, b và sử dụng trong các bài toán:
    a. Tối giản một phân số
    b. Tìm ước số chung lớn nhất và bội số chung nhỏ nhất của dãy n số nguyên dương nhập từ bàn phím
    Quote Quote

  2. #2
    Tham gia
    13-03-2009
    Bài viết
    65
    Like
    0
    Thanked 0 Times in 0 Posts
    Ủa cái này là đố chơi cho vui hay sao vậy. ^^

  3. #3
    Tham gia
    24-02-2009
    Location
    Mr.Đông- Công ty CPTM đầu tư công nghệ SPS (Website: SPS.VN)
    Bài viết
    483
    Like
    107
    Thanked 37 Times in 37 Posts
    y cua ban la nhu the nao hả.chẳng hiểu

  4. #4
    Tham gia
    01-03-2009
    Bài viết
    220
    Like
    0
    Thanked 0 Times in 0 Posts
    giải thuật tìm ước chung lớn nhất của a,ba>b)
    lấy a-b,rồi so sánh a-b với b,số nào lớn hơn thì trừ số còn lại,rồi tiếp tục so sánh hiệu đó với số còn lại đó,lặp lại cho đến khi a=b.ước chung lớn nhất lúc này =a=b.Nếu a<b thì thay thế vị trí của 2 số.Tối giản phân số chẳng qua là tìm ước chung lớn nhất của tử và mẫu rồi chia cả tử và mẫu cho số đó.

  5. #5
    Tham gia
    31-03-2004
    Bài viết
    77
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi kimduquan View Post
    giải thuật tìm ước chung lớn nhất của a,ba>b)
    lấy a-b,rồi so sánh a-b với b,số nào lớn hơn thì trừ số còn lại,rồi tiếp tục so sánh hiệu đó với số còn lại đó,lặp lại cho đến khi a=b.ước chung lớn nhất lúc này =a=b.Nếu a<b thì thay thế vị trí của 2 số.Tối giản phân số chẳng qua là tìm ước chung lớn nhất của tử và mẫu rồi chia cả tử và mẫu cho số đó.
    Làm cách này mà với a = 10^10 và b = 2 thì chạy cũng mệt nghỉ đó bác :p
    Cách tìm ước chung lớn nhất tốt nhất mà tui biết là thực hiện dãy các phép chia có dư dựa trên thuật toán Euclid : http://vi.wikipedia.org/wiki/Gi%E1%B...%BA%ADt_Euclid

  6. #6
    Tham gia
    13-03-2009
    Bài viết
    65
    Like
    0
    Thanked 0 Times in 0 Posts
    Giải thuật ước chung lớn nhất (a,b), với a>b:
    -lấy (a%b)(chia lấy dư)=x:
    Chia trường hợp ra:
    1.b%x==0 &a%x==0 thì x là đáp số.
    2.b%(x/2)==0 &a%x/2==0 thì x/2 là đáp số.
    3.b%y(y<x/2)==0 & a%y==0 thì y là đáp số.
    Được sửa bởi zxfantaxz lúc 12:35 ngày 24-03-2009

  7. #7
    Tham gia
    01-03-2009
    Bài viết
    220
    Like
    0
    Thanked 0 Times in 0 Posts
    Theo mình cách của mình đã trình bày chỉ nên áp dụng cho trường hợp a/b>b và a%b!=0 thôi còn dối với trường hợp a/b<b và a%b!=0thì nên áp dụng cách đơn giản nhất đó là chia 2 số cho 2,3,5,7,9,...nếu a%i=b%i=0 thì ucln=i( kĩ thuật đặt cờ hiệu) còn cái ví dụ của bạn là trường hợp a%b=0 nên ko tính.

  8. #8
    Tham gia
    18-01-2009
    Location
    fdgdfg
    Bài viết
    125
    Like
    0
    Thanked 1 Time in 1 Post
    ý tưởng của tui về bài trên là như sau:
    viết hàm tính USCLN ( dùng thuật toán o'clit ( hình như viết sai)). sau đó viết hàm BSCNN bằng cách lấy (a*b)/(USCLN(a,b)). Sau khi nhập tử và mẫu bạn phải lấy trị tuyệt đối của nó. xong rồi tìm USCLN của 2 số vừa lấy trị tuyệt đối xong. rồi lấy a và b chia cho USCLN sau đó in kq ra màn hình.
    Lưu ý: nếu mẫu số là 1 ( tức USCLN==mẫu) thì chỉ int tử thôi.

    Còn câu b thì tìm USCLN của 2 số đầu sau đó tìm tiếp USCLN của số tiếp theo với ước chung lớn nhất của 2 số đầu. Cứ như vậy tới số cuối cùng là xong. Tương tự đối với tìm BSCNN của n số.
    Chúc thành công. Nếu làm xong mà chạy không được thì post lên đây để anh em mình giải quyết.

  9. #9
    Tham gia
    24-03-2009
    Bài viết
    24
    Like
    0
    Thanked 0 Times in 0 Posts
    các bạn co thể tham khảo bai nay cua mình.no chay đúng đấy:

    #include<stdio.h>
    #include<conio.h>
    unsigned int ucln_2so(unsigned int a, unsigned int b)
    { unsigned int ucln;
    ucln=1;
    while(a!=b)
    if(a>b) a=a-b; else b=b-a;
    ucln=a;
    return ucln;
    }
    void main()
    { unsigned int a,b;
    clrscr();
    printf("KIEM TRA PHAN SO TOI GIAN CHUA?\n");
    printf("Ban nhap tu so: "); scanf("%u",&a);
    printf("Ban nhap mau so: "); scanf("%u",&b);
    if(ucln_2so(a,b)>1)
    printf("Phan so chua toi gian. Phan so duoc toi gian thanh: %u/%u ",a/ucln_2so(a,b),b/ucln_2so(a,b));
    else printf("Phan so da toi gian");
    getch();
    }

    có gì cho mình ý kiến nhé. mình làm nó chạy đúng rồi. co bạn nào có cách khác tốt hơn ko?

  10. #10
    Tham gia
    13-03-2009
    Bài viết
    65
    Like
    0
    Thanked 0 Times in 0 Posts
    Đây là code của câu a & câu b:
    Code:
    #include <stdio.h>
    #include <conio.h>
    #define MAX 100
    int ucln(int,int);
    int ucln(int a, int b)
    {
    int s;
    if(a==b)
    return a;
    if(a%b==0 && a>b)
    return b;
    s=a%b;
    a=s;
    if(a>b)
    return ucln(a,b);
    else
    ucln(b,a);
    }
    int main()
    {
    
    int tam,tam1,tam2=1,tam3,tamx;
    int chuoiso[MAX];
    int a,b,i,j,n;
    printf("nhap a: ");
    scanf("%d",&a);
    printf("nhap b: ");
    scanf("%d",&b);
    printf("ucln cua a & b la: %d",ucln(a,b));
    printf("\nnhap tu so a: ");
    scanf("%d",&a);
    printf("nhap mau so b: ");
    scanf("%d",&b);
    printf("a/b= %d/%d",(a/ucln(a,b)),(b/ucln(a,b)));
    printf("\nban can nhap bao nhieu so? ");
    printf("n = ");
    scanf("%d",&n);
    
    for(i=0;i<n;i++)
    {
    printf("nhap so thu %d: ",i+1);
    scanf("%d",&chuoiso[i]);
    }
    
    for(i=1;i<n;i++)
    if(chuoiso[0]>chuoiso[i])
    {
    tam = chuoiso[0];
    chuoiso[0]=chuoiso[i];
    chuoiso[i]=tam;
    }
    
    for(i=1;i<n;i++)
    if(tam1 <ucln(chuoiso[0],chuoiso[i]))
    tam1 =ucln(chuoiso[0],chuoiso[i]);
    
    for(i=tam1;i>0;i--)
    {
    
    for(j=0;j<n;j++)
    {
    if(chuoiso[j]%i==0)
    {
    if(j==n-1)
    {
    printf("ucln cua chuoi n la: %d",i);
    tamx=i;
    goto end;
    }
    continue;
    }
    else
    break;
    }
    
    }
    end:
    
    
    for(i=0;i<n-1;i++)
    for(j=i+1;j<n;j++)
    if(chuoiso[i]==chuoiso[j])
    chuoiso[j]=tamx;
    for(i=0;i<n;i++)
    tam2*=(chuoiso[i]/tamx);
    
    tam2*=tamx;
    for(i=1;i<tamx;i++)
    if(tam2%i==0&&tam2!=tamx)
    {
    tam2=tam2/i;
    break;
    }
    printf("\nbcnn cua chuoi n la: %d", tam2);
    
    
    
    
    getch();
    return 0;
    }
    Nếu có sai sót xin các bạn góp ý cho.
    Được sửa bởi zxfantaxz lúc 21:37 ngày 24-03-2009 Reason: Bổ sung câu B

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

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